אתם יכולים להטמיע אימות בין שירותים באמצעות חשבון שירות בשירות gRPC. בדף הזה מוצג אימות בין שירותים באמצעות דוגמה מלאה, כולל הסבר על אופן ההגדרה של Extensible Service Proxy (ESP) בשירות gRPC כדי לתמוך בבקשות מאומתות, ועל אופן הקריאה לשירות מלקוח gRPC.
כדי ששירות יוכל לבצע קריאות מאומתות ל-Cloud Endpoints API, לשירות הקורא צריך להיות חשבון שירות, והוא צריך לשלוח אסימון אימות בקריאה. הגורם הקורא צריך להשתמש באסימון מזהה של Google או באסימון JWT (JSON Web Token) מותאם אישית שחתום רק על ידי חשבון השירות של הגורם הקורא. ESP מאמת שההצהרה iss ב-JWT תואמת להגדרה issuer בהגדרת השירות. פלטפורמת ה-ESP לא בודקת הרשאות של ניהול זהויות והרשאות גישה שניתנו בחשבון השירות.
בדוגמה שלנו, אתם מגדירים ומשתמשים בצורה הפשוטה ביותר של אימות בין שירותים, שבה הלקוח משתמש בחשבון השירות שלו כדי ליצור אסימוני JWT לאימות. Google Cloud הגישה לשיטות אימות אחרות דומה, אבל התהליך בצד הלקוח לקבלת אסימוני אימות תקפים תלוי בשיטת האימות שבה נעשה שימוש.
לפני שמתחילים
במדריך הזה אנחנו משתמשים בדוגמה של חנות ספרים שמופיעה במדריכים שלנו.
משכפלים את מאגר ה-Git שבו מתארח קוד הדוגמה של gRPC:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.gitכדי לשנות את ספריית העבודה:
cd python-docs-samples/endpoints/bookstore-grpc/אם עדיין אין לכם פרויקט, פועלים לפי ההוראות שבקטע הדרכות כדי להגדיר פרויקט.
בדוגמה הזו נעשה שימוש בפריסה ל-Google Kubernetes Engine, אבל הגדרת האימות זהה גם ל-Compute Engine.
בדוגמה, יש שני פרויקטים ב-Google Cloud Platform שמופיעים בהפניה:
- פרויקט לשירות מנוהל, שהוא הפרויקט שבבעלותו שירות Cloud Endpoints for gRPC.
- הפרויקט של צרכן השירות, שהוא הפרויקט שבבעלותו נמצא לקוח ה-gRPC.
יצירת חשבון שירות ומפתח לצרכן
כדי ליצור את חשבון השירות והמפתח עבור פרויקט הצרכן:
- במסוף Google Cloud , נכנסים אל APIs & services (ממשקי API ושירותים). מוודאים שאתם נמצאים בפרויקט הצרכן.
- בדף Credentials, בתפריט הנפתח Create Credentials, בוחרים באפשרות Service Account Key.
בדף Create service account key, אם יש לכם חשבון שירות קיים שבו אתם רוצים להשתמש, בוחרים אותו. אם לא, בתפריט הנפתח Service account בוחרים באפשרות New service account ומקלידים שם לחשבון.
נוצר בשבילכם מזהה חשבון שירות תואם. חשוב לשים לב למזהה, כי תצטרכו אותו בקטעים הבאים. לדוגמה:
service-account-name@YOUR_PROJECT_ID.iam.gserviceaccount.comלוחצים על הרשימה הנפתחת תפקיד ובוחרים את התפקידים הבאים:
- Service Accounts > Service Account User
- Service Accounts > Service Account Token Creator
מוודאים שסוג המפתח שנבחר הוא JSON.
לוחצים על יצירה. קובץ ה-JSON עם המפתח של חשבון השירות יורד למחשב המקומי שלכם. חשוב לשים לב למיקום ולשמור אותו באופן מאובטח, כי הוא ישמש בהמשך ליצירת אסימונים.
הגדרת אימות לשירות
צריך להשתמש בפרויקט ההפקה לכל השלבים בקטע הזה.
הגדרת אימות בתצורת gRPC API
האימות ל-ESP מוגדר בקטע authentication בקובץ ה-YAML של הגדרת gRPC API. ההגדרה עם אימות לשירות לדוגמה הזה נמצאת ב-api_config_auth.yaml.
בקטע providers מציינים את ספקי האימות שרוצים להשתמש בהם – במקרה הזה, רוצים להשתמש בחשבון שירות של Google כספק אימות. בקטע rules מצוין שנדרשים טוקנים מהספק הזה כדי לגשת לכל השיטות של השירות.
בעותק של הקובץ הזה ממאגר הנתונים המשוכפל:
- מחליפים את
MY_PROJECT_IDבמזהה פרויקט המפיק. - משנים את
SERVICE-ACCOUNT-IDבקטעauthentication(גם בערכיםissuerוגם בערכיםjwks_uri) למזהה של חשבון השירות לצרכן שרשמתם בקטע הקודם. ההגדרה הזו מציינת ל-ESP שאתם רוצים להעניק גישה לשירות שלכם למשתמשים שמספקים טוקנים תקפים מחשבון השירות הספציפי הזה. - אפשר גם להוסיף את התג
jwt_locationsמתחת לרכיבproviders. אתם יכולים להשתמש בערך הזה כדי להגדיר מיקום מותאם אישית של JWT. מיקומי ברירת המחדל של ה-JWT הם המטא-נתוניםAuthorization(עם הקידומת Bearer ) והמטא-נתוניםX-Goog-Iap-Jwt-Assertion.
שומרים את הקובץ לשלב הבא.
פריסת ההגדרה והשירות
השלבים האלה זהים לאלה שמופיעים במאמר תחילת העבודה עם gRPC ב-GKE:
פורסים את הגדרת השירות ב-Endpoints: צריך לעשות את זה גם אם עשיתם את זה במדריך, כי מדובר בהגדרה אחרת. שימו לב לשם השירות שמוחזר:
gcloud endpoints services deploy api_descriptor.pb api_config_auth.yaml --project PRODUCER_PROJECTאם עדיין לא עשיתם זאת, צרו אשכול מאגרי תגים ואמתו את
kubectlבאשכול.פריסת ה-API לדוגמה ו-ESP באשכול. אם אתם משתמשים בפרויקטים נפרדים של יצרן וצרכן, קודם צריך לוודא שהגדרתם את הפרויקט המתאים בכלי
gcloudשל שורת הפקודה:gcloud config set project PRODUCER_PROJECT
קריאה לשיטות מאומתות מלקוח gRPC
לבסוף, בצד הלקוח, אפשר להשתמש במפתח של חשבון השירות כדי ליצור אסימון JWT, ואז להשתמש באסימון כדי לקרוא לשיטה מאומתת של חנות הספרים.
קודם כול, מתקינים את דרישות Python המתאימות כדי ליצור את האסימון ולהריץ את לקוח הדוגמה. מוודאים שאתם נמצאים בתיקייה python-docs-samples/endpoints/bookstore-grpc של הלקוח המשוכפל, ואז:
virtualenv bookstore-env
source bookstore-env/bin/activate
pip install -r requirements.txt
יצירת טוקן JWT
בדוגמה הזו, חנות הספרים משתמשת באימות שירות לשירות, שבו השירות המתקשר מאומת באופן בלעדי על ידי חשבון השירות שלו, ולכן קל ליצור אסימון מתאים לשליחה עם הבקשות שלנו. שימו לב שאפשר גם לדרוש אימות מחמיר יותר משירות לשירות, שבו האסימון שנוצר צריך לעבור אימות נוסף על ידי Google (באמצעות אסימון מזהה של Google).
בדוגמה הזו, סקריפט Python שסופק יכול ליצור אסימון מקובץ מפתח JSON שהורד קודם לכן, באמצעות מזהה משתמש וכתובת אימייל פיקטיביים.
כדי ליצור אסימון באמצעות הסקריפט:
יוצרים טוקן JWT ומקצים אותו למשתנה
$JWT_TOKEN:JWT_TOKEN=$(python jwt_token_gen.py \ --file=[SERVICE_ACCOUNT_FILE] \ --audiences=[SERVICE_NAME] \ --issuer=[SERVICE-ACCOUNT-ID])where:
-
[SERVICE_ACCOUNT_FILE]הוא קובץ מפתח JSON של חשבון שירות צרכני שהורדתם. -
[SERVICE_NAME]הוא השם של שירות חנות הספרים שהוחזר כשפרסתם את הגדרת השירות המעודכנת שלו ב-Endpoints. -
[SERVICE-ACCOUNT-ID]הוא המזהה המלא של חשבון השירות הפרטי כשיוצרים את חשבון השירות.
-
ביצוע קריאת gRPC מאומתת
בשלב האחרון הזה נעשה שימוש ב-bookstore_client.py, שהוא אותו לקוח שבו נעשה שימוש במדריכים. כדי לבצע קריאה מאומתת, הלקוח מעביר את ה-JWT כמטא-נתונים עם הפעלת ה-method.
כדי להריץ את הדוגמה:
משתמשים ב-
kubectl get servicesכדי לקבל את כתובת ה-IP החיצונית של חנות הספרים שפרסתם:#kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE echo 10.11.246.240 104.196.186.92 80/TCP 10d endpoints 10.11.243.168 104.196.210.50 80/TCP,8090/TCP 10d esp-grpc-bookstore 10.11.254.34 104.196.60.37 80/TCP 1d kubernetes 10.11.240.1 <none> 443/TCP 10dבמקרה הזה, השירות הוא
esp-grpc-bookstoreוכתובת ה-IP החיצונית שלו היא104.196.60.37.מקצים את כתובת ה-IP למשתנה
EXTERNAL_IPEXTERNAL_IP=104.196.60.37רשימה של כל המדפים משירות חנות הספרים:
python bookstore_client.py --port=80 --host=$EXTERNAL_IP --auth_token=$JWT_TOKENהשירות מחזיר את כל המדפים בחנות הספרים הנוכחית. כדי לוודא זאת, אפשר לא לספק אסימון או לציין מזהה שגוי של חשבון שירות כשיוצרים את ה-JWT. הפקודה אמורה להיכשל.