מטרות
חובה לדרוש מהמשתמשים באפליקציית App Engine לעבור אימות באמצעות IAP.
גישה לזהויות של משתמשים באפליקציה כדי להציג את כתובת האימייל המאומתת של המשתמש הנוכחי.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init
רקע
במדריך הזה נעשה שימוש ב-IAP לאימות משתמשים. זו רק אחת מכמה גישות אפשריות. בקטע מושגי אימות מוסבר על השיטות השונות לאימות משתמשים.
אפליקציית Hello user-email-address
האפליקציה במדריך הזה היא אפליקציית App Engine מינימלית מסוג Hello world, עם תכונה אחת לא אופיינית: במקום Hello world מוצג Hello user-email-address, כאשר user-email-address היא כתובת האימייל של המשתמש המאומת.
הפונקציונליות הזו מתאפשרת באמצעות בדיקה של המידע המאומת ש-IAP מוסיף לכל בקשה לאחזור מהרשת שהוא מעביר לאפליקציה שלכם. יש שלוש כותרות בקשה חדשות שנוספות לכל בקשה לאחזור מהרשת שמגיעה לאפליקציה שלכם. שתי הכותרות הראשונות הן מחרוזות טקסט פשוט שבהן אפשר להשתמש כדי לזהות את המשתמש. הכותרת השלישית היא אובייקט חתום בצורה מוצפנת עם אותו מידע.
X-Goog-Authenticated-User-Email: כתובת האימייל של המשתמש מזהה אותו. אל תאחסנו מידע אישי אם האפליקציה יכולה להימנע מכך. האפליקציה הזו לא שומרת נתונים, אלא רק מחזירה אותם למשתמש.
X-Goog-Authenticated-User-Id: מזהה המשתמש הזה שמוקצה על ידי Google לא מציג מידע על המשתמש, אבל הוא מאפשר לאפליקציה לדעת שהמשתמש המחובר הוא אותו משתמש שנראה בעבר.
X-Goog-Iap-Jwt-Assertion: אתם יכולים להגדיר Google Cloud אפליקציות כך שיקבלו בקשות אינטרנט מאפליקציות אחרות בענן, ויעקפו את IAP, בנוסף לבקשות אינטרנט מהאינטרנט. אם אפליקציה מוגדרת כך, יכול להיות שבבקשות כאלה יהיו כותרות מזויפות. במקום להשתמש באחד מהכותרות של הטקסט הפשוט שצוינו קודם, אפשר להשתמש בכותרת הזו שחתמה באופן קריפטוגרפי ולאמת אותה כדי לבדוק שהמידע סופק על ידי Google. גם כתובת האימייל של המשתמש וגם User-ID קבוע זמינים כחלק מכותרת חתומה.
אם אתם בטוחים שהאפליקציה מוגדרת כך שרק בקשות אינטרנט יכולות להגיע אליה, ושאי אפשר להשבית את שירות הרכישות מתוך האפליקציה, אז כדי לאחזר מזהה משתמש ייחודי צריך רק שורת קוד אחת:
user_id = request.headers.get('X-Goog-Authenticated-User-ID')
עם זאת, באפליקציה עמידה צריך לצפות לבעיות, כולל בעיות לא צפויות בהגדרות או בסביבה. לכן, מומלץ ליצור פונקציה שמשתמשת בכותרת החתומה קריפטוגרפית ומאמתת אותה. אי אפשר לזייף את החתימה של הכותרת הזו, ואחרי האימות שלה אפשר להשתמש בה כדי להחזיר את הזיהוי.
יצירת קוד המקור
משתמשים בעורך טקסט כדי ליצור קובץ בשם
main.pyומדביקים בו את הקוד הבא:הסבר מפורט על הקובץ
main.pyמופיע בקטע הסבר על הקוד בהמשך המדריך הזה.יוצרים עוד קובץ בשם
requirements.txtומדביקים בו את הטקסט הבא:בקובץ
requirements.txtמפורטות כל ספריות Python הלא סטנדרטיות שהאפליקציה צריכה ש-App Engine יטען בשבילה:
Flaskהיא מסגרת האינטרנט של Python שמשמשת לאפליקציה.
cryptographyהוא מודול שמספק פונקציות קריפטוגרפיות חזקות.python-jose[cryptography]מספקת את פונקציית הבדיקה והפענוח של JWT.
requestsמאחזר נתונים מאתרים.
יוצרים קובץ בשם
app.yamlומכניסים לתוכו את הטקסט הבא:קובץ
app.yamlמציין ל-App Engine איזו סביבת שפה נדרשת לקוד.
הסבר על הקוד
בקטע הזה מוסבר איך הקוד ב-main.py פועל. אם אתם רק רוצים להריץ את האפליקציה, אתם יכולים לדלג לקטע פריסת האפליקציה.
הקוד הבא נמצא בקובץ main.py. כשמתקבלת באפליקציה בקשת HTTP GET לדף הבית, מסגרת Flask מפעילה את הפונקציה say_hello:
הפונקציה say_hello מקבלת את ערך הכותרת של טענת ה-JWT ש-IAP הוסיף מהבקשה הנכנסת, וקוראת לפונקציה כדי לאמת את הערך הזה שחתום בצורה מוצפנת. הערך הראשון שמוחזר (כתובת אימייל) משמש ליצירת דף אינטרנט מינימלי שמוחזר.
הפונקציה validate_assertion משתמשת בפונקציה jwt.decode מהספרייה jose של צד שלישי כדי לוודא שההצהרה חתומה בצורה תקינה, וכדי לחלץ את פרטי המטען הייעודי (payload) מההצהרה. המידע הזה כולל את כתובת האימייל של המשתמש המאומת ומזהה ייחודי קבוע של המשתמש.
אם אי אפשר לפענח את הטענה, הפונקציה הזו מחזירה None לכל אחד מהערכים האלה ומדפיסה הודעה כדי לרשום את השגיאה ביומן.
כדי לאמת הצהרת JWT, צריך לדעת את אישורי המפתח הציבורי של הישות שחתמה על ההצהרה (Google במקרה הזה) ואת קהל היעד שאליו ההצהרה מיועדת. באפליקציית App Engine, קהל היעד הוא מחרוזת עם Google Cloud פרטי זיהוי של הפרויקט. הפונקציה הזו מקבלת את האישורים האלה ואת מחרוזת הקהל מהפונקציות שקדמו לה.