הספרייה של Google Identity Services מאפשרת למשתמשים לבקש קוד הרשאה מ-Google באמצעות חלון קופץ מבוסס-דפדפן או זרימת חוויית משתמש של הפניה אוטומטית. הפעולה הזו מתחילה תהליך מאובטח של OAuth 2.0 ומסתיימת באסימון גישה שמשמש להפעלת ממשקי Google API מטעם המשתמש.
סיכום של תהליך הרשאה באמצעות קוד OAuth 2.0:
- מדפדפן, באמצעות תנועה כמו לחיצה על לחצן, הבעלים של חשבון Google מבקש קוד הרשאה מ-Google.
- Google מגיבה ושולחת קוד הרשאה ייחודי או לקריאה חוזרת באפליקציית האינטרנט של JavaScript שפועלת בדפדפן של המשתמש, או שמפעילה ישירות את נקודת הקצה של קוד ההרשאה באמצעות הפניה אוטומטית בדפדפן.
- פלטפורמת ה-Backend מארחת נקודת קצה של קוד הרשאה ומקבלת את הקוד. אחרי האימות, הפלטפורמה מחליפה את הקוד הזה באסימוני גישה ורענון לכל משתמש באמצעות בקשה לנקודת הקצה של Google לאסימונים.
- Google מאמתת את קוד ההרשאה, מוודאת שהבקשה הגיעה מהפלטפורמה המאובטחת שלכם, מנפיקה אסימוני גישה ורענון ומחזירה את האסימונים על ידי קריאה לנקודת הקצה של ההתחברות שמתארחת בפלטפורמה שלכם.
- נקודת הקצה (endpoint) של הכניסה מקבלת את אסימוני הגישה והרענון, ומאחסנת בצורה מאובטחת את אסימון הרענון לשימוש מאוחר יותר.
דרישות מוקדמות
פועלים לפי השלבים שמתוארים בקטע הגדרה כדי להגדיר את מסך ההסכמה ל-OAuth, לקבל מזהה לקוח ולטעון את ספריית הלקוח.
אתחול של לקוח Code
השיטה google.accounts.oauth2.initCodeClient()
מאתחלת לקוח קוד.
מצב חלון קופץ או הפניה אוטומטית
אפשר לבחור לשתף קוד אימות באמצעות זרימת המשתמש במצב הפניה אוטומטית או במצב חלון קופץ. במצב Redirect, אתם מארחים נקודת קצה של הרשאת OAuth2 בשרת שלכם, ו-Google מפנה את סוכן המשתמש לנקודת הקצה הזו, ומשתפת את קוד האימות כפרמטר של כתובת URL. במצב חלון קופץ, מגדירים פונקציית callback של JavaScript ששולחת את קוד ההרשאה לשרת. אתם יכולים להשתמש במצב חלון קופץ כדי לספק חוויית משתמש חלקה בלי שהמבקרים יצטרכו לצאת מהאתר.
כדי לאתחל לקוח בשביל:
מגדירים את
ux_mode
ל-redirect
, ואת הערך שלredirect_uri
לנקודת הקצה של קוד ההרשאה בפלטפורמה. הערך צריך להיות זהה בדיוק לאחד מכתובות ה-URI המורשות להפניה אוטומטית של לקוח OAuth 2.0 שהגדרתם ב-Google Cloud Console. הוא צריך גם לעמוד בכללים לאימות URI של הפניה.תהליך חוויית המשתמש בחלון קופץ, מגדירים את
ux_mode
ל-popup
ואת הערך שלcallback
לשם הפונקציה שבה תשתמשו כדי לשלוח קודי הרשאה לפלטפורמה שלכם. ערך ברירת המחדל שלredirect_uri
הוא המקור של הדף שקורא ל-initCodeClient
. הערך הזה ישמש בהמשך התהליך כשמחליפים את קוד האימות באסימון גישה או באסימון רענון. לדוגמה, אםhttps://www.example.com/index.html
מתקשר אלinitCodeClient
והמקור:https://www.example.com
הוא הערך שלredirect_url
.
הגנה מפני מתקפות CSRF
בתהליכי חוויית המשתמש במצב הפניה אוטומטית ובמצב חלון קופץ נעשה שימוש בטכניקות שונות במקצת כדי למנוע תקיפות של זיוף בקשות חוצות אתרים (CSRF). במצב 'הפניה אוטומטית', צריך להשתמש בפרמטר state של OAuth 2.0. מידע נוסף על יצירה ואימות של הפרמטר state זמין בסעיף 10.12 ב-RFC6749 בנושא זיוף בקשות חוצות אתרים. במצב חלון קופץ, מוסיפים כותרת HTTP מותאמת אישית לבקשות, ואז בשרת מאשרים שהיא תואמת לערך ולמקור הצפויים.
בוחרים מצב UX כדי לראות קטע קוד שבו מוצגים קוד האימות וטיפול ב-CSRF:
מצב הפניה אוטומטית
מאתחלים לקוח שבו Google מפנה את הדפדפן של המשתמש לנקודת הקצה של האימות, ומשתפת את קוד ההרשאה כפרמטר של כתובת URL.
const client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
ux_mode: 'redirect',
redirect_uri: 'https://oauth2.example.com/code',
state: 'YOUR_BINDING_VALUE'
});
מצב חלון קופץ
מאחלים אתחול של לקוח שבו המשתמש מתחיל את תהליך ההרשאה בתיבת דו-שיח קופצת. אחרי שהמשתמש מביע הסכמה, Google מחזירה את קוד ההרשאה לדפדפן של המשתמש באמצעות פונקציית קריאה חוזרת. בקשת POST ממטפל הקריאות החוזרות של JS מעבירה את קוד האימות לנקודת קצה בשרת העורפי, שבו מאמתים אותו ואז משלימים את שאר תהליך OAuth.
const client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
ux_mode: 'popup',
callback: (response) => {
const xhr = new XMLHttpRequest();
xhr.open('POST', "https://oauth2.example.com/code", true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// Set custom header for CRSF
xhr.setRequestHeader('X-Requested-With', 'XmlHttpRequest');
xhr.onload = function() {
console.log('Auth code response: ' + xhr.responseText);
};
xhr.send('code=' + response.code);
},
});
הפעלת תהליך קוד OAuth 2.0
מתקשרים לשיטה requestCode()
של לקוח הקוד כדי להפעיל את תהליך המשתמש:
<button onclick="client.requestCode();">Authorize with Google</button>
המשתמש יצטרך להיכנס לחשבון Google ולהסכים לשיתוף של היקפי הרשאות ספציפיים לפני שיוחזר קוד הרשאה לנקודת הקצה להפניה או ל-callback handler.
טיפול בקוד אימות
Google יוצרת קוד הרשאה ייחודי לכל משתמש, שאתם מקבלים ומאמתים בשרת העורפי שלכם.
במצב חלון קופץ, ה-handler שצוין על ידי callback
, שפועל בדפדפן של המשתמש, מעביר את קוד ההרשאה לנקודת קצה שמתארחת בפלטפורמה שלכם.
במצב הפניה אוטומטית, Google שולחת בקשת GET
לנקודת הקצה שצוינה על ידי redirect_uri
, ומשתפת את קוד ההרשאה בפרמטר code של כתובת ה-URL. כדי לקבל את קוד ההרשאה:
יוצרים נקודת קצה חדשה להרשאה אם אין לכם הטמעה קיימת, או
מעדכנים את נקודת הקצה הקיימת כדי לקבל בקשות
GET
ופרמטרים של כתובת URL. בעבר, Google שלחה בקשתPUT
עם ערך קוד ההרשאה במטען הייעודי (payload).
נקודת קצה להרשאה
נקודת הקצה של קוד ההרשאה צריכה לטפל בבקשות מסוג GET
עם הפרמטרים הבאים של מחרוזת השאילתה של כתובת ה-URL:
שם | ערך |
---|---|
authuser | בקשה לאימות של כניסת משתמש |
קוד | קוד הרשאה ל-OAuth2 שנוצר על ידי Google |
hd | הדומיין המתארח של חשבון המשתמש |
הנחיה | תיבת דו-שיח להבעת הסכמה של משתמשים |
היקף | רשימה מופרדת ברווחים של היקפי OAuth2 אחד או יותר שיש לאשר |
הסמוי הסופי | משתנה מצב CRSF |
דוגמה לבקשת GET
עם פרמטרים של כתובת URL לנקודת קצה בשם auth-code שמתארחת בכתובת example.com:
Request URL: https://www.example.com/auth-code?state=42a7bd822fe32cc56&code=4/0AX4XfWiAvnXLqxlckFUVao8j0zvZUJ06AMgr-n0vSPotHWcn9p-zHCjqwr47KHS_vDvu8w&scope=email%20profile%20https://www.googleapis.com/auth/calendar.readonly%20https://www.googleapis.com/auth/photoslibrary.readonly%20https://www.googleapis.com/auth/contacts.readonly%20openid%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile&authuser=0&hd=example.com&prompt=consent
כשמתחילים את תהליך קבלת קוד ההרשאה באמצעות ספריות JavaScript קודמות, או באמצעות ביצוע קריאות ישירות לנקודות הקצה של Google OAuth 2.0, Google שולחת בקשת POST
.
דוגמה לבקשת POST
שמכילה את קוד ההרשאה כמטען ייעודי (payload) בגוף בקשת ה-HTTP:
Request URL: https://www.example.com/auth-code
Request Payload: 4/0AX4XfWhll-BMV82wi4YwbrSaTPaRpUGpKqJ4zBxQldU\_70cnIdh-GJOBZlyHU3MNcz4qaw
אימות הבקשה
כדי להימנע ממתקפות CSRF, צריך לבצע את הפעולות הבאות בשרת.
בודקים את הערך של הפרמטר state במצב הפניה אוטומטית.
מאשרים שהכותרת X-Requested-With: XmlHttpRequest
מופיעה במצב חלון קופץ.
אחרי כן, צריך להמשיך ולקבל אסימוני רענון וגישה מ-Google רק אם קודם אימתתם בהצלחה את בקשת קוד ההרשאה.
קבלת אסימוני גישה ורענון
אחרי שפלטפורמת ה-Backend מקבלת קוד הרשאה מ-Google ומאמתת את הבקשה, צריך להשתמש בקוד ההרשאה כדי לקבל מ-Google אסימוני גישה ורענון, וכך לבצע קריאות ל-API.
פועלים לפי ההוראות החל משלב 5: החלפת קוד ההרשאה באסימוני רענון וגישה במדריך שימוש ב-OAuth 2.0 לאפליקציות אינטרנט.
ניהול טוקנים
הפלטפורמה שלכם מאחסנת באופן מאובטח את טוקני הרענון. צריך למחוק את אסימוני הרענון המאוחסנים כשמסירים חשבונות משתמשים, או כשמשתמש מבטל את ההסכמה באמצעות google.accounts.oauth2.revoke
או ישירות מכתובת https://myaccount.google.com/permissions.
אפשר גם להשתמש ב-RISC כדי להגן על חשבונות משתמשים באמצעות הגנה על חשבונות שונים.
בדרך כלל, פלטפורמת ה-Backend שלכם תפעיל ממשקי Google API באמצעות אסימון גישה. אם אפליקציית האינטרנט שלכם תפעיל גם קריאות ישירות לממשקי Google API מהדפדפן של המשתמש, תצטרכו להטמיע דרך לשיתוף אסימון הגישה עם אפליקציית האינטרנט. ההסבר על כך לא נכלל במדריך הזה. כשמשתמשים בגישה הזו ובספריית הלקוח של Google API ל-JavaScript, משתמשים ב-gapi.client.SetToken()
כדי לאחסן באופן זמני את אסימון הגישה בזיכרון של הדפדפן, וכך מאפשרים לספרייה לקרוא ל-Google APIs.