כששולחים בקשה מאפליקציה שפועלת בסביבת זמן הריצה של Python 2 לאפליקציה אחרת של App Engine, אפשר להשתמש ב-App Identity API של App Engine כדי לאמת את הזהות שלה. האפליקציה שמקבלת את הבקשה יכולה להשתמש בזהות הזו כדי לקבוע אם לעבד את הבקשה.
אם אפליקציות Python 3 צריכות לאמת את הזהות שלהן כששולחים בקשות לאפליקציות אחרות של App Engine, אפשר להשתמש באסימוני מזהה של OpenID Connect (OIDC) שמונפקים ומפוענחים על ידי ממשקי ה-API של OAuth 2.0 של Google.
הנה סקירה כללית של השימוש באסימונים מזהים מסוג OIDC כדי לאמת את הזהות:
- אפליקציית App Engine בשם App A מאחזרת טוקן של מזהה מ Google Cloud סביבת זמן הריצה.
- אפליקציה א' מוסיפה את האסימון הזה לכותרת של בקשה ממש לפני שליחת הבקשה לאפליקציה ב', שהיא אפליקציית App Engine אחרת.
- אפליקציה ב' משתמשת בממשקי Google OAuth 2.0 API כדי לאמת את מטען הייעודי (payload) של הטוקן. המטען הייעודי (payload) שפוענח מכיל את הזהות המאומתת של אפליקציה א' בתבנית של כתובת האימייל של חשבון השירות שמוגדר כברירת מחדל באפליקציה א'.
- אפליקציה ב' משווה את הזהות במטען הייעודי (payload) לרשימה של זהויות שמותר לה להגיב להן. אם הבקשה הגיעה מאפליקציה מורשית, אפליקציה ב' מעבדת את הבקשה ומגיבה.
במדריך הזה מוסבר איך לעדכן את אפליקציות App Engine כדי להשתמש באסימוני מזהה של OpenID Connect (OIDC) לאימות הזהות, ואיך לעדכן את אפליקציות App Engine אחרות כדי להשתמש באסימוני מזהה לאימות הזהות לפני עיבוד הבקשה.
ההבדלים העיקריים בין ממשקי ה-API של זהות האפליקציה ו-OIDC
באפליקציות בסביבת זמן הריצה של Python 2, אין צורך להצהיר במפורש על הזהות. כשמשתמשים בספריות Python
httplib,urllibאוurllib2או בשירות אחזור כתובות ה-URL של App Engine כדי לשלוח בקשות יוצאות, סביבת זמן הריצה משתמשת בשירות אחזור כתובות ה-URL של App Engine כדי לשלוח את הבקשה. אם הבקשה נשלחת לדומייןappspot.com, URL Fetch מאמת באופן אוטומטי את הזהות של האפליקציה ששולחת את הבקשה על ידי הוספת הכותרתX-Appengine-Inbound-Appidלבקשה. הכותרת הזו מכילה את מזהה האפליקציה (שנקרא גם מזהה הפרויקט).באפליקציות בסביבת זמן הריצה של Python 3 צריך לאמת את הזהות באופן מפורש על ידי אחזור אסימון מזהה OIDC מ Google Cloud סביבת זמן הריצה והוספתו לכותרת הבקשה. תצטרכו לעדכן את כל הקוד ששולח בקשות לאפליקציות אחרות של App Engine, כך שהבקשות יכללו אסימון מזהה OIDC.
הכותרת
X-Appengine-Inbound-Appidבבקשה מכילה את מזהה הפרויקט של האפליקציה ששלחה את הבקשה.המטען הייעודי (payload) של טוקן מזהה OIDC של Google לא מזהה ישירות את מזהה הפרויקט של האפליקציה עצמה. במקום זאת, האסימון מזהה את חשבון השירות שהאפליקציה פועלת תחתיו, על ידי ציון כתובת האימייל של חשבון השירות הזה. תצטרכו להוסיף קוד כדי לחלץ את שם המשתמש ממטען הייעודי (payload) של הטוקן.
אם חשבון השירות הזה הוא חשבון השירות שמשמש כברירת המחדל של App Engine ברמת האפליקציה בפרויקט, אפשר למצוא את מזהה הפרויקט בכתובת האימייל של חשבון השירות. החלק של שם המשתמש בכתובת זהה למזהה הפרויקט. במקרה כזה, קוד האפליקציה המקבלת יכול לחפש את מזהה הפרויקט ברשימת מזהי הפרויקטים שהאפליקציה תאפשר בקשות מהם.
עם זאת, אם האפליקציה ששולחת את הבקשה משתמשת בחשבון שירות שמנוהל על ידי המשתמש במקום בחשבון השירות שמשמש כברירת המחדל של App Engine, האפליקציה שמקבלת את הבקשה יכולה לאמת רק את הזהות של חשבון השירות הזה, ולא בהכרח את מזהה הפרויקט של האפליקציה ששולחת את הבקשה. במקרה כזה, האפליקציה המקבלת תצטרך לשמור רשימה של כתובות אימייל מותרות של חשבונות שירות במקום רשימה של מזהי פרויקטים מותרים.
המכסות של קריאות ל-URL Fetch API שונות מהמכסות של Google OAuth 2.0 APIs למתן טוקנים. אתם יכולים לראות את המספר המקסימלי של אסימונים שאפשר להעניק בכל יום בGoogle Cloud מסך ההסכמה ל-OAuth במסוף. לא נחייב אתכם על שימוש ב-URL Fetch, ב-App Identity API או ב-Google's OAuth 2.0 APIs.
סקירה כללית של תהליך המיגרציה
כדי להעביר את אפליקציות Python לשימוש בממשקי OIDC API כדי לאמת את הזהות:
באפליקציות שצריכות לאמת את הזהות שלהן כששולחות בקשות לאפליקציות אחרות של App Engine:
צריך להמתין עד שהאפליקציה תפעל בסביבת Python 3 כדי לבצע מיגרציה לטוקנים של מזהי לקוחות.
אפשר להשתמש בטוקנים של מזהים בסביבת זמן הריצה של Python 2, אבל השלבים ב-Python 2 מורכבים ונדרשים רק באופן זמני עד שתעדכנו את האפליקציה להרצה בסביבת זמן הריצה של Python 3.
אחרי שהאפליקציה פועלת ב-Python 3, מעדכנים את האפליקציה כדי לבקש טוקן של מזהה ולהוסיף את הטוקן ל-request header.
באפליקציות שבהן נדרש אימות זהות לפני עיבוד בקשה:
כדי להתחיל, צריך לשדרג את אפליקציות Python 2 כדי לתמוך גם באסימוני מזהה וגם בזהויות של App Identity API. כך תוכלו לאפשר לאפליקציות שלכם לאמת ולעבד בקשות מאפליקציות Python 2 שמשתמשות ב-App Identity API או מאפליקציות Python 3 שמשתמשות באסימוני זהות.
אחרי שהאפליקציות המשודרגות של Python 2 יהיו יציבות, תוכלו להעביר אותן לזמן הריצה של Python 3. חשוב להמשיך לתמוך גם באסימוני מזהה וגם בזהויות של App Identity API עד שתהיו בטוחים שהאפליקציות כבר לא צריכות לתמוך בבקשות מאפליקציות מדור קודם.
כשכבר לא צריך לעבד בקשות מאפליקציות App Engine מדור קודם, צריך להסיר את הקוד שמאמת את הזהויות של App Identity API.
אחרי בדיקת האפליקציות, פורסים קודם את האפליקציה שמטפלת בבקשות. לאחר מכן פורסים את אפליקציית Python 3 המעודכנת שמשתמשת באסימוני זיהוי כדי לאמת את הזהות.
הצהרת זהות
מחכים עד שהאפליקציה פועלת בסביבת Python 3, ואז פועלים לפי השלבים הבאים כדי לשדרג את האפליקציה ולאמת את הזהות באמצעות טוקנים של מזהים:
מתקינים את ספריית הלקוח
google-auth.מוסיפים קוד כדי לבקש אסימון מזהה מ-Google OAuth 2.0 APIs ולהוסיף את האסימון לכותרת של בקשה לפני שליחת הבקשה.
בודקים את העדכונים.
התקנה של ספריית הלקוח google-auth לאפליקציות Python 3
כדי להפוך את ספריית הלקוח google-auth לזמינה באפליקציית Python3, יוצרים קובץ requirements.txt באותה תיקייה שבה נמצא הקובץ app.yaml ומוסיפים את השורה הבאה:
google-auth
כשפורסים את האפליקציה, App Engine מוריד את כל יחסי התלות שמוגדרים בקובץ requirements.txt.
לפיתוח מקומי, מומלץ להתקין את יחסי התלות בסביבה וירטואלית כמו venv.
הוספת קוד לאימות הזהות
מחפשים בקוד את כל המקרים של שליחת בקשות לאפליקציות אחרות של App Engine. לפני ששולחים את הבקשה, צריך לעדכן את המקרים האלה כדי לבצע את הפעולות הבאות:
מוסיפים את ההצהרות הבאות של ייבוא:
from google.auth.transport import requests as reqs from google.oauth2 import id_tokenמשתמשים ב-
google.oauth2.id_token.fetch_id_token(request, audience)כדי לאחזר טוקן של מזהה. כוללים את הפרמטרים הבאים בהפעלת method:-
request: מעבירים את אובייקט הבקשה שמתכוננים לשלוח.
audience: מעבירים את כתובת ה-URL של האפליקציה שאליה שולחים את הבקשה. הפעולה הזו קושרת את הטוקן לבקשה ומונעת שימוש בטוקן על ידי אפליקציה אחרת.כדי להבטיח בהירות וספציפיות, מומלץ להעביר את
appspot.comכתובת ה-URL ש-App Engine יצר לשירות הספציפי שמקבל את הבקשה, גם אם אתם משתמשים בדומיין מותאם אישית לאפליקציה.
-
באובייקט הבקשה, מגדירים את הכותרת הבאה:
'Authorization': 'ID {}'.format(token)
לדוגמה:
עדכוני בדיקות לאימות הזהות
כדי להריץ את האפליקציה באופן מקומי ולבדוק אם האפליקציה יכולה לשלוח אסימוני מזהה בהצלחה:
כדי להפוך את פרטי הכניסה של חשבון השירות שמוגדר כברירת מחדל ב-App Engine לזמינים בסביבה המקומית (Google OAuth APIs דורש את פרטי הכניסה האלה כדי ליצור טוקן של מזהה):
מזינים את הפקודה
gcloudהבאה כדי לאחזר את מפתח חשבון השירות של חשבון App Engine שמוגדר כברירת מחדל בפרויקט:gcloud iam service-accounts keys create ~/key.json --iam-account project-ID@appspot.gserviceaccount.comמחליפים את project-ID במזההGoogle Cloud הפרויקט.
עכשיו מתבצעת הורדה של קובץ המפתח של חשבון השירות למחשב שלכם. אפשר להעביר את הקובץ לאן שרוצים ולשנות את השם שלו למה שרוצים. חשוב לאחסן את הקובץ הזה באופן מאובטח כי הוא יכול לשמש לצורך אימות כחשבון השירות שלכם. אם הקובץ אבד או שנחשף למשתמשים לא מורשים, צריך למחוק את המפתח של חשבון השירות וליצור מפתח חדש.
מזינים את הפקודה הבאה:
<code>export GOOGLE_APPLICATION_CREDENTIALS=<var>service-account-key</var></code>
מחליפים את service-account-key בנתיב השם המוחלט של הקובץ שמכיל את המפתח של חשבון השירות שהורדתם.
באותו מעטפת שבה ייצאתם את משתנה הסביבה
GOOGLE_APPLICATION_CREDENTIALS, מפעילים את אפליקציית Python.שולחים בקשה מהאפליקציה ומוודאים שהיא מצליחה. אם אין לכם אפליקציה שיכולה לקבל בקשות ולהשתמש בטוקנים של מזהים כדי לאמת זהויות:
- מורידים את האפליקציה לדוגמה 'נכנסות'.
בקובץ
main.pyשל הדוגמה, מוסיפים את המזהה של Google Cloud הפרויקט אלallowed_app_ids. לדוגמה:allowed_app_ids = [ '<APP_ID_1>', '<APP_ID_2>', 'my-project-id' ]מריצים את הדוגמה המעודכנת ב-Python 2 בשרת הפיתוח המקומי.
אימות בקשות ועיבוד שלהן
כדי לשדרג את האפליקציות שלכם ב-Python 2 כך שישתמשו באסימונים מזהים או בזהויות של App Identity API לפני עיבוד הבקשות:
מתקינים את ספריית הלקוח google-auth.
מעדכנים את הקוד כך שיבצע את הפעולות הבאות:
אם הבקשה מכילה את הכותרת
X-Appengine-Inbound-Appid, צריך להשתמש בכותרת הזו כדי לאמת את הזהות. אפליקציות שפועלות בסביבת ריצה מדור קודם כמו Python 2 יכללו את הכותרת הזו.אם הבקשה לא מכילה את הכותרת
X-Appengine-Inbound-Appid, המערכת בודקת אם יש טוקן של מזהה מסוג OIDC. אם האסימון קיים, צריך לאמת את מטען האסימון ולבדוק את הזהות של השולח.
בודקים את העדכונים.
התקנת ספריית הלקוח google-auth לאפליקציות Python 2
כדי להפוך את ספריית הלקוח google-auth לזמינה לאפליקציית Python 2:
יוצרים קובץ
requirements.txtבאותה תיקייה שבה נמצא הקובץapp.yamlומוסיפים את השורה הבאה:google-auth==1.19.2מומלץ להשתמש בגרסה 1.19.2 של ספריית הלקוח Cloud Logging כי היא תומכת באפליקציות Python 2.7.
בקטע
librariesבקובץapp.yamlשל האפליקציה, מציינים את ספריית ה-SSL אם היא עדיין לא צוינה:libraries: - name: ssl version: latestיוצרים ספרייה לאחסון ספריות של צד שלישי, כמו
lib/. אחר כך משתמשים ב-pip installכדי להתקין את הספריות בספרייה. לדוגמה:pip install -t lib -r requirements.txt
יוצרים קובץ
appengine_config.pyבאותה תיקייה שבה נמצא קובץapp.yaml. מוסיפים לקובץappengine_config.pyאת הנתונים הבאים:# appengine_config.py import pkg_resources from google.appengine.ext import vendor # Set path to your libraries folder. path = 'lib' # Add libraries installed in the path folder. vendor.add(path) # Add libraries to pkg_resources working set to find the distribution. pkg_resources.working_set.add_entry(path)
בדוגמה הקודמת, הקובץ
appengine_config.pyמניח שהתיקייהlibנמצאת בספריית העבודה הנוכחית. אם אתם לא יכולים להבטיח שהתיקייהlibתמיד תהיה בספריית העבודה הנוכחית, צריך לציין את הנתיב המלא לתיקייהlib. לדוגמה:import os path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
לפיתוח מקומי, מומלץ להתקין את התלות בסביבה וירטואלית כמו virtualenv ל-Python 2.
עדכון הקוד לאימות בקשות
מחפשים בקוד את כל המקרים שבהם מתקבל הערך של הכותרת X-Appengine-Inbound-Appid. מעדכנים את המקרים האלה כדי לבצע את הפעולות הבאות:
מוסיפים את ההצהרות הבאות של ייבוא:
from google.auth.transport import requests as reqs from google.oauth2 import id_tokenאם הבקשה הנכנסת לא מכילה את הכותרת
X-Appengine-Inbound-Appid, צריך לחפש את הכותרתAuthorizationולאחזר את הערך שלה.הערך של הכותרת הוא בפורמט ID: token.
אפשר להשתמש ב-
google.oauth2.id_token.verify_oauth2_token(token, request, audience)כדי לאמת ולאחזר את המטען הייעודי (payload) של הטוקן אחרי הפענוח. כוללים את הפרמטרים הבאים בהפעלת ה-method:-
token: מעבירים את האסימון שחולץ מהבקשה הנכנסת.
request: מעבירים אובייקטgoogle.auth.transport.Requestחדש.
audience: מעבירים את כתובת ה-URL של האפליקציה הנוכחית (האפליקציה ששולחת את בקשת האימות). שרת ההרשאות של Google ישווה את כתובת ה-URL הזו לכתובת ה-URL שסופקה כשנוצר האסימון במקור. אם כתובות ה-URL לא תואמות, הטוקן לא יאומת ושרת ההרשאות יחזיר שגיאה.
-
השיטה
verify_oauth2_tokenמחזירה את מטען הייעודי (payload) של האסימון המפוענח, שמכיל כמה זוגות של שם/ערך, כולל כתובת האימייל של חשבון השירות שמוגדר כברירת מחדל עבור האפליקציה שיצרה את האסימון.מחפשים את שם המשתמש מכתובת האימייל במטען הייעודי (payload) של הטוקן.
שם המשתמש זהה למזהה הפרויקט של האפליקציה ששלחה את הבקשה. זהו אותו ערך שהוחזר קודם בכותרת
X-Appengine-Inbound-Appid.אם שם המשתמש או מזהה הפרויקט מופיעים ברשימת מזהי הפרויקטים המורשים, הבקשה תעובד.
לדוגמה:
עדכוני בדיקות לאימות הזהות
כדי לבדוק שהאפליקציה יכולה להשתמש בטוקן של מזהה או בכותרת X-Appengine-Inbound-Appid כדי לאמת בקשות, מריצים את האפליקציה בשרת הפיתוח המקומי של Python 2 ושולחים בקשות מאפליקציות Python 2 (שישתמשו ב-App Identity API) ומאפליקציות Python 3 ששולחות טוקנים של מזהים.
אם לא עדכנתם את האפליקציות כך שישלחו טוקנים של מזהים:
מורידים את האפליקציה לדוגמה "בקשה".
מוסיפים את פרטי הכניסה של חשבון השירות לסביבה המקומית, כמו שמתואר במאמר בדיקת עדכונים לאפליקציות שמאשרות טענות.
משתמשים בפקודות סטנדרטיות של Python 3 כדי להפעיל את אפליקציית Python 3 לדוגמה.
שולחים בקשה מהאפליקציה לדוגמה ומוודאים שהיא מצליחה.
פריסת האפליקציות
כשמוכנים לפרוס את האפליקציות, צריך:
אם האפליקציות פועלות ללא שגיאות, משתמשים בפיצול תנועה כדי להגדיל בהדרגה את התנועה לאפליקציות המעודכנות. כדאי לעקוב מקרוב אחרי האפליקציות כדי לוודא שאין בעיות לפני שמפנים אליהן יותר תנועה.
שימוש בחשבון שירות אחר כדי לאשר את הזהות
כשמבקשים טוקן של מזהה, הבקשה משתמשת בזהות של חשבון השירות שמוגדר כברירת מחדל של App Engine. כשמאמתים את האסימון, מטען הייעודי (payload) של האסימון מכיל את כתובת האימייל של חשבון השירות שמוגדר כברירת מחדל, שמופנה למזהה הפרויקט של האפליקציה.
לחשבון השירות שמוגדר כברירת מחדל ב-App Engine יש רמת הרשאות גבוהה מאוד כברירת מחדל. הוא יכול להציג ולערוך את כלGoogle Cloud הפרויקט, ולכן ברוב המקרים לא מומלץ להשתמש בחשבון הזה כשהאפליקציה צריכה לבצע אימות בשירותי Cloud.
עם זאת, אפשר להשתמש בחשבון השירות שמוגדר כברירת מחדל כדי לאשר את זהות האפליקציה, כי אתם משתמשים בטוקן של מזהה רק כדי לאמת את הזהות של האפליקציה ששלחה את הבקשה. במהלך התהליך הזה, לא נלקחות בחשבון ההרשאות שניתנו לחשבון השירות, וגם לא צריך אותן.
אם אתם עדיין מעדיפים להשתמש בחשבון שירות אחר לבקשות שלכם לטוקנים של מזהה, אתם צריכים לבצע את הפעולות הבאות:
מגדירים משתנה סביבה בשם
GOOGLE_APPLICATION_CREDENTIALSלנתיב של קובץ JSON שמכיל את פרטי הכניסה של חשבון השירות. כדאי לעיין בהמלצות שלנו בנושא אחסון בטוח של פרטי הכניסה האלה.משתמשים ב-
google.oauth2.id_token.fetch_id_token(request, audience)כדי לאחזר טוקן של מזהה.כשמאמתים את הטוקן, מטען הייעודי (payload) של הטוקן יכיל את כתובת האימייל של חשבון השירות החדש.