אם מינוי דחיפה משתמש באימות, שירות Pub/Sub חותם על אסימון אינטרנט מסוג JSON (JWT) ושולח את ה-JWT בכותרת ההרשאה של בקשת הדחיפה. ה-JWT כולל הצהרות וחתימה.
מנויים יכולים לאמת את ה-JWT ולוודא את הדברים הבאים:
- הטענות מדויקות.
- שירות Pub/Sub חתם על הטענות.
אם המנויים משתמשים בחומת אש, הם לא יכולים לקבל בקשות להצגת התראות פוש. כדי לקבל בקשות push, צריך להשבית את חומת האש ולאמת את ה-JWT.
אם למנוי יש חומת אש, יכול להיות שתקבלו 403 permission deniedשגיאה.
לפני שמתחילים
פורמט JWT
ה-JWT הוא JWT של OpenIDConnect שמורכב מכותרת, מקבוצת הצהרות ומחתימה. שירות Pub/Sub מקודד את ה-JWT כמחרוזת base64 עם נקודות כמפרידים.
לדוגמה, כותרת ההרשאה הבאה כוללת JWT מקודד:
"Authorization" : "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdkNjgwZDhjNzBkNDRlOTQ3MTMzY2JkNDk5ZWJjMWE2MWMzZDVh YmMiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJodHRwczovL2V4YW1wbGUuY29tIiwiYXpwIjoiMTEzNzc0M jY0NDYzMDM4MzIxOTY0IiwiZW1haWwiOiJnYWUtZ2NwQGFwcHNwb3QuZ3NlcnZpY2VhY2NvdW50LmNvb SIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJleHAiOjE1NTAxODU5MzUsImlhdCI6MTU1MDE4MjMzNSwia XNzIjoiaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTEzNzc0MjY0NDYzMDM4MzIxO TY0In0.QVjyqpmadTyDZmlX2u3jWd1kJ68YkdwsRZDo-QxSPbxjug4ucLBwAs2QePrcgZ6hhkvdc4UHY 4YF3fz9g7XHULNVIzX5xh02qXEH8dK6PgGndIWcZQzjSYfgO-q-R2oo2hNM5HBBsQN4ARtGK_acG-NGG WM3CQfahbEjZPAJe_B8M7HfIu_G5jOLZCw2EUcGo8BvEwGcLWB2WqEgRM0-xt5-UPzoa3-FpSPG7DHk7 z9zRUeq6eB__ldb-2o4RciJmjVwHgnYqn3VvlX9oVKEgXpNFhKuYA-mWh5o7BCwhujSMmFoBOh6mbIXF cyf5UiVqKjpqEbqPGo_AvKvIQ9VTQ"
הכותרת וקבוצת הטענות הן מחרוזות JSON. אחרי הפענוח, הם ייראו כך:
{"alg":"RS256","kid":"7d680d8c70d44e947133cbd499ebc1a61c3d5abc","typ":"JWT"} { "aud":"https://example.com", "azp":"113774264463038321964", "email":"gae-gcp@appspot.s3ns-system.iam.gserviceaccount.com", "sub":"113774264463038321964", "email_verified":true, "exp":1550185935, "iat":1550182335, "iss":"https://accounts.google.com" }
יכול להיות שהטוקנים שמצורפים לבקשות שנשלחות לנקודות קצה של הודעות פוש יהיו בני עד שעה.
הגדרת Pub/Sub לאימות Push
בדוגמה הבאה אפשר לראות איך מגדירים את חשבון השירות של שירות האימות בדחיפה לחשבון שירות לפי בחירה, ואיך מעניקים את התפקיד iam.serviceAccountTokenCreator לסוכן השירות service-{PROJECT_NUMBER}@gcp-sa-pubsub.s3ns-system.iam.gserviceaccount.com.
המסוף
עוברים לדף Pub/Sub Subscriptions (מינויים ל-Pub/Sub).
לוחצים על יצירת מינוי.
כותבים שם בשדה Subscription ID.
בוחרים נושא.
בוחרים באפשרות Push בתור סוג השליחה.
מזינים כתובת URL של נקודת קצה.
מסמנים את התיבה הפעלת אימות.
בוחרים חשבון שירות.
מוודאים שלסוכן השירות
service-{PROJECT_NUMBER}@gcp-sa-pubsub.s3ns-system.iam.gserviceaccount.comמוקצה התפקידiam.serviceAccountTokenCreatorבלוח הבקרה של IAM בפרויקט. אם התפקיד לא הוקצה לחשבון השירות, לוחצים על Grant (הענקת הרשאה) בלוח הבקרה של IAM כדי להקצות אותו.אופציונלי: מזינים קהל.
לוחצים על יצירה.
gcloud
# Configure the push subscription gcloud pubsub subscriptions (create|update|modify-push-config) ${SUBSCRIPTION} \ --topic=${TOPIC} \ --push-endpoint=${PUSH_ENDPOINT_URI} \ --push-auth-service-account=${SERVICE_ACCOUNT_EMAIL} \ --push-auth-token-audience=${OPTIONAL_AUDIENCE_OVERRIDE} # Your service agent # `service-{PROJECT_NUMBER}@gcp-sa-pubsub.s3ns-system.iam.gserviceaccount.com` needs to have the # `iam.serviceAccountTokenCreator` role. PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.s3ns-system.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\ --role='roles/iam.serviceAccountTokenCreator'
כשמפעילים אימות למינוי לקבלת עדכונים, יכול להיות שתיתקלו בשגיאה permission denied או not authorized.
כדי לפתור את הבעיה, צריך לתת לחשבון המשתמש שיזם את היצירה או העדכון של המינוי את ההרשאה iam.serviceAccounts.actAs בחשבון השירות. מידע נוסף זמין במאמר בנושא אימות בקטע 'יצירת מינויים ל-Push'.
אם אתם משתמשים במינוי דחיפה מאומת עם אפליקציית App Engine שמאובטחת באמצעות שרת proxy לאימות זהויות (IAP), אתם צריכים לספק את מזהה הלקוח של IAP כקהל של אסימון האימות של הודעות ה-Push.
כדי להפעיל את IAP באפליקציית App Engine, אפשר לעיין במאמר בנושא הפעלת IAP.
כדי למצוא את מזהה הלקוח של הרכישות מתוך האפליקציה, מחפשים את IAP-App-Engine-app Client ID בדף Credentials.
תלונות
אפשר להשתמש ב-JWT כדי לאמת שההצהרות – כולל ההצהרות email ו-aud – חתומות על ידי Google. למידע נוסף על השימוש בממשקי Google OAuth 2.0 API לאימות ולהרשאה, תוכלו לקרוא את המאמר OpenID Connect.
יש שני מנגנונים שנותנים משמעות לטענות האלה. קודם כול, ב-Pub/Sub נדרש שלמשתמש או לחשבון השירות שמבצעים את הקריאה ל-CreateSubscription, UpdateSubscription או ModifyPushConfig יהיה תפקיד עם ההרשאה iam.serviceAccounts.actAs בחשבון השירות של שירות האימות של הודעות Push. דוגמה לתפקיד כזה היא התפקיד roles/iam.serviceAccountUser.
שנית, הגישה לאישורים שמשמשים לחתימה על האסימונים מבוקרת בקפידה. כדי ליצור את האסימון, Pub/Sub צריכה לקרוא לשירות פנימי של Google באמצעות זהות נפרדת של חשבון שירות לחתימה, שהוא סוכן השירות service-${PROJECT_NUMBER}@gcp-sa-pubsub.s3ns-system.iam.gserviceaccount.com.
לחשבון השירות שמשמש לחתימה צריכה להיות ההרשאה iam.serviceAccounts.getOpenIdToken או התפקיד Service Account Token Creator (roles/iam.serviceAccountTokenCreator) בחשבון השירות של אימות בדחיפה (או בכל משאב אב, כמו הפרויקט, של חשבון השירות של אימות בדחיפה).
אימות טוקנים
כדי לאמת טוקנים שנשלחים מ-Pub/Sub לנקודת הקצה של ה-push, צריך:
- בדיקת התקינות של הטוקן באמצעות אימות החתימה.
- מוודאים שהטענות email ו-audience בטוקן תואמות לערכים שהוגדרו בהגדרות של מינוי דחיפה.
בדוגמה הבאה מוסבר איך לאמת בקשת push לאפליקציית App Engine שלא מאובטחת באמצעות שרת proxy לאימות זהויות (IAP). אם אפליקציית App Engine מאובטחת באמצעות IAP, כותרת בקשת ה-HTTP שמכילה את אסימון ה-JWT של IAP היא x-goog-iap-jwt-assertion, וצריך לאמת אותה בהתאם.
פרוטוקול
בקשה:
GET https://oauth2.googleapis.com/tokeninfo?id_token={BEARER_TOKEN}
תשובה:
200 OK
{
"alg": "RS256",
"aud": "example.com",
"azp": "104176025330667568672",
"email": "{SERVICE_ACCOUNT_NAME}@{YOUR_PROJECT_NAME}.s3ns.iam.gserviceaccount.com",
"email_verified": "true",
"exp": "1555463097",
"iat": "1555459497",
"iss": "https://accounts.google.com",
"kid": "3782d3f0bc89008d9d2c01730f765cfb19d3b70e",
"sub": "104176025330667568672",
"typ": "JWT"
}C#
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של C# במאמר הפעלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub C# API.
המשך
Java
Node.js
Python
Ruby
מידע על משתנה הסביבה PUBSUB_VERIFICATION_TOKEN שבו נעשה שימוש בדוגמאות הקוד שלמעלה זמין במאמר כתיבה של הודעות Pub/Sub ומענה להן.
במדריך לכניסה לחשבון Google באתרים יש דוגמאות נוספות לאימות של JWT מסוג Bearer. סקירה כללית רחבה יותר של אסימוני OpenID זמינה במדריך OpenID Connect, כולל רשימה של ספריות לקוח שעוזרות לאמת אסימוני JWT.
אימות משירותים אחרים של Cloud de Confiance by S3NS Google
פונקציות Cloud Run ו-App Engine מאמתות קריאות HTTP מ-Pub/Sub על ידי אימות אסימונים שנוצרו על ידי Pub/Sub. ההגדרה היחידה שנדרשת היא הקצאת תפקידי ה-IAM הנדרשים לחשבון של מבצע הקריאה.
במדריכים ובסרטוני ההדרכה הבאים אפשר למצוא מידע על תרחישי שימוש שונים בשירותים האלה:
Cloud Run
- הפעלה מ-Pub/Sub push: לחשבון השירות של שירות האימות של ה-push צריכים להיות התפקיד
roles/run.invokerוקישור לשירות Cloud Run כדי להפעיל שירות Cloud Run תואם. - מדריך לשימוש ב-Pub/Sub עם Cloud Run
App Engine
פונקציות Cloud Run
- טריגרים של HTTP:
אם אתם מתכוונים להשתמש בבקשות push של Pub/Sub כטריגרים של HTTP לפונקציה, לחשבון השירות של שירות האימות שלכם צריך להיות תפקיד
roles/cloudfunctions.invokerכדי להפעיל פונקציה. - Google Cloud Pub/Sub Triggers: אם משתמשים בטריגרים של Pub/Sub כדי להפעיל פונקציה, תפקידי ה-IAM וההרשאות מוגדרים אוטומטית.