הדרכות מפורטות

בסדרת ההסברים המפורטים הזו מוצגים כל החלקים של תוסף פעיל ל-Classroom. כל שלב בהדרכה מתייחס למושגים ספציפיים ומיישם אותם באפליקציית אינטרנט אחת. המטרה היא לעזור לכם להגדיר, לקבוע את ההגדרות ולהפעיל תוסף פונקציונלי.

התוסף צריך להיות באינטראקציה עם פרויקט בענן של Google. אם אתם לא מכירים את Google Cloud, מומלץ לקרוא את מדריכי תחילת העבודה. אתם מנהלים את פרטי הכניסה, את הגישה ל-API ואת Google Workspace Marketplace SDK במסוף Google Cloud. מידע נוסף על Marketplace SDK זמין במדריך דף הרישום של Google Workspace Marketplace.

הנושאים במדריך:

  • איך משתמשים ב-Google Cloud כדי ליצור דף שיוצג ב-iframe ב-Classroom.
  • להוסיף כניסה יחידה (SSO) דרך Google ולאפשר למשתמשים להיכנס.
  • מבצעים קריאות ל-API כדי לצרף את התוסף למטלה.
  • לבדוק אם התוסף עומד בדרישות העיקריות לשליחת תוספים ובדרישות לגבי תכונות חובה.

במדריך הזה אנחנו יוצאים מנקודת הנחה שאתם מכירים תכנות ומושגים בסיסיים בפיתוח אתרים. מומלץ מאוד לקרוא את המדריך להגדרת פרויקט לפני שמתחילים את ההדרכות. בדף הזה מופיעים פרטי הגדרה חשובים שלא מוסברים באופן מלא במדריכים המפורטים.

הטמעות לדוגמה

דוגמה מלאה להפניה זמינה ב-Python. הטמעות חלקיות זמינות גם ב-Java וב-Node.js. ההטמעות האלה הן המקורות של קוד הדוגמה שמופיע בדפים הבאים.

איפה אפשר להוריד

הדוגמאות ל-Python ול-Java זמינות במאגרי GitHub:

אפשר להוריד את הדוגמה של Node.js כקובץ ZIP:

דרישות מוקדמות

כדי להכין פרויקט חדש של תוספים, צריך לעיין בקטעים הבאים.

אישור HTTPS

אפשר לארח את האפליקציה בכל סביבת פיתוח, אבל התוסף של Classroom זמין רק דרך https://. לכן, כדי לפרוס את האפליקציה או לבדוק אותה ב-iframe של התוסף, צריך שרת עם הצפנת SSL.

אפשר להשתמש ב-localhost עם אישור SSL. אם אתם צריכים ליצור אישור לפיתוח מקומי, כדאי להשתמש ב-mkcert.

פרויקט ב-Google Cloud

כדי להשתמש בדוגמאות האלה, צריך להגדיר פרויקט בענן ב-Google Cloud. במדריך יצירת פרויקט ב-Google Cloud מוסבר מה צריך לעשות כדי להתחיל. בקטע הגדרת פרויקט ב-Google Cloud במדריך הראשון מוסבר גם איך לבצע את פעולות ההגדרה הספציפיות.

בסיום, מורידים את מזהה הלקוח של OAuth 2.0 כקובץ JSON. צריך להוסיף את קובץ פרטי הכניסה הזה לספריית הדוגמה אחרי שחולצים את הקבצים. מידע על מיקומים ספציפיים מופיע במאמר הסבר על הקבצים.

פרטי כניסה של OAuth

כדי ליצור פרטי כניסה חדשים של OAuth:

  • עוברים לדף Google Cloud Credentials. מוודאים שבחרתם את הפרויקט הנכון בחלק העליון של המסך.
  • לוחצים על CREATE CREDENTIALS (יצירת אמצעי אימות) ובוחרים באפשרות OAuth client ID (מזהה לקוח OAuth) מהתפריט הנפתח.
  • בדף הבא:
    • מגדירים את סוג האפליקציה בתור אפליקציית אינטרנט.
    • בקטע Authorized redirect URIs (כתובות URI מורשות להפניה אוטומטית), לוחצים על ADD URI (הוספת כתובת URI). מוסיפים את הנתיב המלא של מסלול להחזרת קריאה לאפליקציה. לדוגמה, https://my.domain.com/auth-callback או https://localhost:5000/callback. בהמשך המדריך הזה נסביר איך ליצור את המסלול הזה ולטפל בו. תמיד אפשר לערוך או להוסיף עוד מסלולים כאלה.
    • לוחצים על יצירה.
  • לאחר מכן מוצגת תיבת דו-שיח עם פרטי הכניסה החדשים שנוצרו. בוחרים באפשרות DOWNLOAD JSON (הורדת JSON). מעתיקים את קובץ ה-JSON שהורדתם לספרייה של השרת.

דרישות מוקדמות ספציפיות לשפה

כדי לראות את הרשימה העדכנית ביותר של הדרישות המוקדמות, צריך לעיין בקובץ ה-README בכל מאגר.

Python

בדוגמה שלנו ל-Python השתמשנו ב-framework של Flask. אפשר להוריד את קוד המקור המלא מהקישורים שמופיעים כאן.

במקרה הצורך, מתקינים את Python 3.7 ואילך ומוודאים ש-pip זמין.

python3 -m ensurepip --upgrade

מומלץ גם להגדיר ולהפעיל סביבה וירטואלית חדשה של Python.

python3 -m venv .classroom-addon-env
source .classroom-addon-env/bin/activate

בכל ספריית משנה של מדריך מפורט בדוגמאות שהורדתם יש requirements.txt. אפשר להתקין במהירות את הספריות הנדרשות באמצעות pip. כדי להתקין את הספריות הנדרשות לתרגול הראשון, משתמשים בפקודות הבאות.

cd flask/01-basic-app
pip install -r requirements.txt

Node.js

בדוגמה שלנו ל-Node.js נעשה שימוש ב-Express framework. אפשר להוריד את קוד המקור המלא מהקישורים שמופיעים כאן.

בדוגמה הזו נדרשת Node.js v16.13 ואילך.

מתקינים את מודולי הצומת הנדרשים באמצעות npm.

npm install

Java

בדוגמה שלנו ל-Java נעשה שימוש ב-Spring Boot framework. אפשר להוריד את קוד המקור המלא מהקישורים שמופיעים כאן.

אם Java 11+‎ עדיין לא מותקנת במחשב, מתקינים אותה.

אפליקציות Spring Boot יכולות להשתמש ב-Gradle או ב-Maven כדי לטפל בבנייה ולנהל תלויות. הדוגמה הזו כוללת את Maven wrapper, שמאפשר לבצע build בהצלחה בלי להתקין את Maven עצמו.

בספרייה שבה הורדתם או שיבטתם את הפרויקט, מריצים את הפקודות הבאות כדי לוודא שיש לכם את הדרישות המוקדמות להרצת הפרויקט.

java --version
./mvnw --version

או ב-Windows:

java -version
mvnw.cmd --version

הסבר על הקבצים

בקטעים הבאים מתוארת הפריסה של הספריות לדוגמה.

שמות של ספריות

כל מאגר מכיל כמה ספריות שהשמות שלהן מתחילים במספר, כמו /01-basic-app/. המספרים תואמים לשלבים ספציפיים במדריך. כל תיקייה מכילה אפליקציית אינטרנט שפועלת במלואה ומיישמת את התכונות שמתוארות במדריך מסוים. לדוגמה, הספרייה /01-basic-app/ מכילה את ההטמעה הסופית של המדריך יצירת תוסף.

תוכן המדריך

התוכן של הספרייה משתנה בהתאם לשפת ההטמעה:

Python

  • ספריית הבסיס מכילה את הקבצים הבאים:

    • main.py – נקודת הכניסה לאפליקציית Python. מציינים בקובץ את הגדרות השרת שרוצים להשתמש בהן, ואז מריצים אותו כדי להפעיל את השרת.
    • requirements.txt – מודולי Python שנדרשים להרצת אפליקציית האינטרנט. אפשר להתקין אותם באופן אוטומטי באמצעות pip install -r requirements.txt.
    • client_secret.json – קובץ סוד הלקוח שהורד מ-Google Cloud. שימו לב שהקובץ הזה לא נכלל בארכיון לדוגמה. צריך לשנות את השם של קובץ ההרשאות שהורד ולהעתיק אותו לכל תיקיית בסיס.

  • config.py – אפשרויות הגדרה לשרת Flask.

  • בספרייה webapp מופיע התוכן של אפליקציית האינטרנט. היא כוללת את הפריטים הבאים:

  • ספריית /templates/ עם תבניות Jinja לדפים שונים.

  • הספרייה /static/ עם תמונות, CSS וקובצי JavaScript משניים.

  • routes.py – שיטות הטיפול במסלולים של אפליקציית האינטרנט.

  • __init__.py – הפונקציה לאתחול המודול webapp. הפונקציה הזו מפעילה את שרת Flask וטוענת את אפשרויות ההגדרה שמוגדרות בקובץ config.py.

  • קבצים נוספים לפי הצורך בשלב מסוים במדריך.

Node.js

כל שלב בהדרכה מופיע בתיקיית משנה משלו <step>. כל שלב מכיל את הפרטים הבאים:

  • קבצים סטטיים כמו JavaScript, ‏ CSS ותמונות נמצאים בתיקייה ./<step>/public.
  • נתבי Express נמצאים בתיקיות ./<step>/routes.
  • תבניות HTML נמצאות בתיקיות ./<step>/views.
  • אפליקציית השרת היא ./<step>/app.js.

Java

ספריית הפרויקט כוללת את הפריטים הבאים:

  • הספרייה src.main מכילה את קוד המקור ואת ההגדרות להרצת האפליקציה בהצלחה. הספרייה הזו כוללת את הפריטים הבאים: + הספרייה java.com.addons.spring מכילה את הקבצים Application.java ו-Controller.java. הקובץ Application.java אחראי להפעלת שרת האפליקציות, והקובץ Controller.java מטפל בלוגיקה של נקודת הקצה. ‫+ הספרייה resources מכילה את הספרייה templates עם קובצי HTML ו-JavaScript. הוא מכיל גם את הקובץ application.properties שמציין את היציאה להרצת השרת, את הנתיב לקובץ מאגר המפתחות ואת הנתיב לספרייה templates. בדוגמה הזו, קובץ מאגר המפתחות נמצא בספרייה resources. אפשר לאחסן אותו בכל מקום שרוצים, אבל חשוב לעדכן את הנתיב בקובץ application.properties בהתאם.
    • pom.xml מכיל את המידע שנדרש לבניית הפרויקט ולהגדרת התלות הנדרשת.
    • .gitignore מכיל שמות של קבצים שאסור להעלות ל-git. חשוב להוסיף את הנתיב למאגר המפתחות ב-.gitignore. בדוגמה שצוינה, זה secrets/*.p12 (הסבר על המטרה של מאגר המפתחות מופיע בקטע הבא). במדריכים 2 ואילך, צריך לכלול גם את הנתיב לקובץ client_secret.json כדי לוודא שלא תכללו את הסודות שלכם במאגר מרוחק. במדריכים מפורטים 3 ואילך, צריך להוסיף את הנתיב לקובץ מסד הנתונים H2 ואת הפקטורי (factory) של מאגר הנתונים של הקובץ. מידע נוסף על ההגדרה של מאגרי הנתונים האלה זמין במדריך השלישי בנושא טיפול בביקורים חוזרים.
    • mvnw ו-mvnw.cmd הם קובצי ההפעלה של Maven Wrapper ל-Unix ול-Windows, בהתאמה. לדוגמה, הפעלת הפקודה ./mvnw --version ב-Unix מפיקה את גרסת Apache Maven, בין שאר הפרטים.
    • הספרייה .mvn מכילה את ההגדרה של Maven Wrapper.

מריצים את שרת הדוגמה

כדי לבדוק את השרת, צריך להפעיל אותו. כדי להריץ את שרת הדוגמה בשפה הרצויה, פועלים לפי ההוראות הבאות:

Python

פרטי כניסה ל-OAuth

יוצרים ומורידים את פרטי הכניסה בפרוטוקול OAuth כפי שמתואר למעלה. ממקמים את קובץ ה-JSON בספריית השורש לצד קובץ ההפעלה של השרת של האפליקציה.

הגדרת השרת

יש כמה אפשרויות להפעלת שרת האינטרנט. בסוף קובץ ה-Python, מוסיפים אחת מהשורות הבאות:

  1. לא מאובטח localhost. הערה: האפשרות הזו מתאימה לבדיקה ישירה רק בחלון דפדפן. אי אפשר לטעון דומיינים לא מאובטחים ב-iframe של תוסף Classroom.

    if __name__ == "__main__":
      # Disable OAuthlib's HTTPs verification.
      os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
    
      # Run the web app at http://localhost:5000.
      app.run(debug=True)
    
  2. מאובטח localhost. צריך לציין טאפל של קובצי מפתח SSL לארגומנט ssl_context.

    if __name__ == "__main__":
      # Run the web app at https://localhost:5000.
      app.run(host="localhost",
              ssl_context=("localhost.pem", "localhost-key.pem"),
              debug=True)
    
  3. שרת Gunicorn. האפשרות הזו מתאימה לשרת מוכן לייצור או לפריסה בענן. מומלץ להגדיר משתנה סביבה PORT לשימוש באפשרות ההפעלה הזו.

    if __name__ == "__main__":
      # Run the web app at https://<your domain>:<server_port>.
      # Defaults to https://<your domain>:8080.
      server_port = os.environ.get("PORT", "8080")
      app.run(debug=True, port=server_port, host="0.0.0.0")
    

הפעלת השרת

מריצים את אפליקציית Python כדי להפעיל את השרת כפי שהוגדר בשלב הקודם.

python main.py

לוחצים על כתובת ה-URL שמופיעה כדי לראות את אפליקציית האינטרנט בדפדפן ולוודא שהיא פועלת בצורה תקינה.

Node.js

הגדרת השרת

כדי להפעיל את השרת באמצעות HTTPS, צריך ליצור אישור עצמי שמשמש להפעלת האפליקציה באמצעות HTTPS. פרטי הכניסה האלה צריכים להיקרא sslcert/cert.pem ו-sslcert/key.pem ולהישמר בתיקיית הבסיס של המאגר. יכול להיות שתצטרכו להוסיף את המפתחות האלה למחזיק המפתחות של מערכת ההפעלה כדי שהדפדפן יקבל אותם.

מוודאים שהקובץ *.pem נמצא בקובץ .gitignore כי לא רוצים לבצע commit של הקובץ ל-git.

הפעלת השרת

אפשר להריץ את האפליקציה באמצעות הפקודה הבאה, ולהחליף את step01 בשלב הנכון שרוצים להריץ כשרת (לדוגמה, step01 עבור 01-basic-app ו-step02 עבור 02-sign-in).

npm run step01

או

npm run step02

הפעולה הזו תפעיל את שרת האינטרנט בכתובת https://localhost:5000.

אפשר להפסיק את השרת באמצעות הפקודה Control + C במסוף.

Java

הגדרת השרת

כדי להפעיל את השרת באמצעות HTTPS, צריך ליצור אישור עצמי שמשמש להפעלת האפליקציה באמצעות HTTPS.

כדאי להשתמש ב-mkcert לפיתוח מקומי. אחרי שמתקינים את mkcert, הפקודות הבאות יוצרות אישור שמאוחסן באופן מקומי כדי להפעיל את HTTPS.

mkcert -install
mkcert -pkcs12 -p12-file <path_to_keystore> <domain_name>

בדוגמה הזו, קובץ מאגר המפתחות נמצא בספריית המשאבים. אפשר לאחסן אותו בכל מקום שרוצים, אבל חשוב לעדכן את הנתיב בקובץ application.properties בהתאם. שם הדומיין הוא הדומיין שבו הפרויקט פועל (לדוגמה, localhost).

מוודאים שהקובץ *.p12 נמצא בקובץ .gitignore כי לא רוצים לבצע commit של הקובץ ל-git.

הפעלת השרת

מפעילים את השרת על ידי הרצת ה-method‏ main בקובץ Application.java. לדוגמה, ב-IntelliJ אפשר ללחוץ לחיצה ימנית על Application.java > Run 'Application' בספרייה src/main/java/com/addons/spring או לפתוח את הקובץ Application.java וללחוץ על החץ הירוק מימין לחתימת השיטה main(String[] args). אפשר גם להריץ את הפרויקט בחלון של מסוף:

./mvnw spring-boot:run

או ב-Windows:

mvnw.cmd spring-boot:run

הפעולה הזו מפעילה את השרת בכתובת https://localhost:5000 או ביציאה שצוינה ב-application.properties.