סקירה כללית
קישור יעיל באמצעות כניסה מבוססת-OAuth עם חשבון Google מוסיף כניסה באמצעות חשבון Google על גבי קישור OAuth. האפשרות הזו מספקת חוויית קישור חלקה למשתמשי Google, והיא גם מאפשרת יצירת חשבון, כך שהמשתמש יכול ליצור חשבון חדש בשירות שלכם באמצעות חשבון Google שלו.
כדי לקשר חשבונות באמצעות OAuth ו'כניסה באמצעות חשבון Google', צריך לבצע את השלבים הכלליים הבאים:
- קודם צריך לבקש מהמשתמש לתת הסכמה לגישה לפרופיל שלו ב-Google.
- משתמשים במידע בפרופיל כדי לבדוק אם חשבון המשתמש קיים.
- למשתמשים קיימים, מקשרים את החשבונות.
- אם לא מצאתם התאמה למשתמש Google במערכת האימות שלכם, צריך לאמת את אסימון הזהות שהתקבל מ-Google. לאחר מכן תוכלו ליצור משתמש על סמך פרטי הפרופיל שכלולים באסימון המזהה.
איור 1. קישור חשבון בטלפון של משתמש באמצעות קישור פשוט
הדרישות לקישור פשוט
- מטמיעים את תהליך הקישור הבסיסי לחשבון באמצעות OAuth. השירות שלכם צריך לתמוך בנקודות קצה של הרשאה והחלפת אסימונים שתואמות ל-OAuth 2.0.
- נקודת הקצה של החלפת האסימונים חייבת לתמוך בהצהרות JSON Web Token (JWT) וליישם את הכוונות
check,createו-get.
הטמעת שרת OAuth
נקודת הקצה של החלפת הטוקנים צריכה לתמוך בכוונות check, create ו-get.
בצע את השלבים הבאים כדי להשלים את תהליך קישור החשבון וללמוד מתי נעשה שימוש בכוונה מסוימת:
- האם למשתמש יש חשבון במערכת האימות שלכם? (המשתמש מחליט על ידי בחירה באפשרות 'כן' או 'לא')
- כן : המשתמש משתמש בכתובת האימייל שמשויכת לחשבון Google שלו כדי להיכנס לפלטפורמה שלכם. (המשתמש מחליט על ידי בחירה באפשרות 'כן' או 'לא')
- כן : האם למשתמש יש חשבון תואם במערכת האימות שלכם? (מתקשרים אל
check intentכדי לאשר)- YES : מתבצעת שיחה אל
get intentוהחשבון מקושר אם הכוונה get מוחזרת בהצלחה. - לא : ליצור חשבון חדש? (המשתמש בוחר באפשרות YES או NO)
- כן : מתבצעת שיחה עם
create intentוהחשבון מקושר אם כוונת היצירה מוחזרת בהצלחה. - לא : תהליך OAuth באינטרנט מופעל, המשתמש מועבר לדפדפן שלו ומוצגת לו האפשרות לקשר עם כתובת אימייל אחרת.
- כן : מתבצעת שיחה עם
- YES : מתבצעת שיחה אל
- לא : מופעל תהליך OAuth בדפדפן, המשתמש מועבר לדפדפן שלו ומוצגת לו אפשרות לקשר עם כתובת אימייל אחרת.
- כן : האם למשתמש יש חשבון תואם במערכת האימות שלכם? (מתקשרים אל
- לא : האם למשתמש יש חשבון תואם במערכת האימות שלך? (מתקשרים אל
check intentכדי לאשר)- YES : מתבצעת שיחה אל
get intentוהחשבון מקושר אם הכוונה get מוחזרת בהצלחה. - לא : מתבצעת קריאה אל
create intentוהחשבון מקושר אם כוונת היצירה מוחזרת בהצלחה.
- YES : מתבצעת שיחה אל
- כן : המשתמש משתמש בכתובת האימייל שמשויכת לחשבון Google שלו כדי להיכנס לפלטפורמה שלכם. (המשתמש מחליט על ידי בחירה באפשרות 'כן' או 'לא')
检查现有用户账号(检查 intent)
在用户同意访问其 Google 个人资料后,Google 会发送 请求,其中包含 Google 用户身份的已签名断言。通过 断言包含的信息包括用户的 Google 账号 ID、 姓名和电子邮件地址为您的 Google Cloud 控制台配置的令牌交换端点 项目处理该请求。
如果您的身份验证中已有相应的 Google 账号
系统时,您的令牌交换端点会返回 account_found=true。如果
Google 账号与现有用户不匹配,您的令牌交换端点
返回“HTTP 404 Not Found”错误以及 account_found=false。
请求的格式如下:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=check&assertion=JWT&scope=SCOPES&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
您的令牌交换端点必须能够处理以下参数:
| 令牌端点参数 | |
|---|---|
intent |
对于这些请求,此参数的值为
check。 |
grant_type |
所交换的令牌的类型。对于这类请求
参数的值为 urn:ietf:params:oauth:grant-type:jwt-bearer。 |
assertion |
一个 JSON Web 令牌 (JWT),提供 Google 用户身份。JWT 包含的信息包括用户 Google 账号 ID、姓名和电子邮件地址。 |
client_id |
您分配给 Google 的客户 ID。 |
client_secret |
您分配给 Google 的客户端密钥。 |
如需响应 check intent 请求,您的令牌交换端点必须执行以下步骤:
- 验证和解码 JWT 断言。
- 检查您的身份验证系统中是否已存在该 Google 账号。
אימות ופענוח של טענת הנכוֹנוּת (assertion) של JWT
אפשר לאמת ולפענח את טענת הנכוֹנוּת (assertion) של JWT באמצעות ספריית פענוח קוד JWT לשפה שלכם. כדאי להשתמש המפתחות הציבוריים של Google זמינים ב JWK או של PEM לצורך אימות לחתימה של האסימון.
אחרי הפענוח, טענת הנכוֹנוּת (assertion) של ה-JWT תיראה כמו הדוגמה הבאה:
{ "sub": "1234567890", // The unique ID of the user's Google Account "iss": "https://accounts.google.com", // The assertion's issuer "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID "iat": 233366400, // Unix timestamp of the assertion's creation time "exp": 233370000, // Unix timestamp of the assertion's expiration time "name": "Jan Jansen", "given_name": "Jan", "family_name": "Jansen", "email": "jan@gmail.com", // If present, the user's email address "email_verified": true, // true, if Google has verified the email address "hd": "example.com", // If present, the host domain of the user's GSuite email address // If present, a URL to user's profile picture "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ", "locale": "en_US" // User's locale, from browser or phone settings }
בנוסף לאימות החתימה של האסימון, צריך לוודא
מנפיק (השדה iss) הוא https://accounts.google.com, שהקהל
(השדה aud) הוא מזהה הלקוח שהוקצה לך, ושתוקף האסימון לא פג
(השדה exp).
באמצעות השדות email, email_verified ו-hd אפשר לקבוע אם
Google מארחת כתובת אימייל מסוימת, והיא מהימן. במקרים שבהם Google
מהימן, כרגע ידוע שהמשתמש הוא הבעלים החוקיים של החשבון
ותוכלו לדלג על סיסמה או על שיטות אחרות לאתגרים. אחרת, השיטות האלה
יכול לשמש לאימות החשבון לפני הקישור.
מקרים שבהם Google היא מהימן:
- ל-
emailיש סיומת@gmail.com. זהו חשבון Gmail. email_verifiedמוגדר כ-True ו-hdמוגדר. זהו חשבון G Suite.
משתמשים יכולים להירשם לחשבונות Google בלי להשתמש ב-Gmail או ב-G Suite. מתי
email לא מכיל סיומת @gmail.com ו-hd חסר Google
מומלץ לאמת סיסמה או סיסמה או שיטות אחרות לאימות
למשתמש. email_verified יכול להיות גם נכון כי Google אימתה בהתחלה את
משתמש כשחשבון Google נוצר, אבל בעלות על הצד השלישי
ייתכן שחשבון האימייל השתנה מאז.
检查您的身份验证系统中是否已存在该 Google 账号
请检查以下任一条件是否成立:
- Google 账号 ID(可在断言的
sub字段中找到)位于您的用户中 数据库。 - 断言中的电子邮件地址与用户数据库中的用户匹配。
如果满足上述任一条件,则表明用户已注册。在这种情况下 返回如下所示的响应:
HTTP/1.1 200 Success
Content-Type: application/json;charset=UTF-8
{
"account_found":"true",
}
如果 Google 账号 ID 和
断言与您的数据库中的用户匹配,该用户尚未注册。在
在这种情况下,您的令牌交换端点需要返回 HTTP 404 错误
指定 "account_found": "false",如以下示例所示:
HTTP/1.1 404 Not found
Content-Type: application/json;charset=UTF-8
{
"account_found":"false",
}
טיפול בקישור אוטומטי (השגת כוונה)
אחרי שהמשתמש מביע הסכמה לגשת לפרופיל Google שלו, Google שולחת בקשה שמכילה טענת נכוֹנוּת (assertion) חתומה של זהות המשתמש ב-Google. טענת הנכוֹנוּת (assertion) מכילה מידע שכולל את מספר חשבון Google של המשתמש, שם וכתובת אימייל. נקודת הקצה להחלפת אסימונים שהוגדרה עבור בפרויקט הזה יטפל בבקשה הזו.
אם חשבון Google התואם כבר קיים באימות
נקודת הקצה (endpoint) של המרת האסימון מחזירה אסימון עבור המשתמש. אם
חשבון Google לא תואם למשתמש קיים, שהוא נקודת הקצה של המרת האסימון
מחזירה שגיאת linking_error ושדה login_hint אופציונלי.
הבקשה מוצגת בפורמט הבא:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=get&assertion=JWT&scope=SCOPES&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
נקודת הקצה (endpoint) של המרת האסימונים חייבת להיות מסוגלת לטפל בפרמטרים הבאים:
| פרמטרים של נקודת קצה של אסימון | |
|---|---|
intent |
בבקשות האלה, הערך של הפרמטר הזה הוא get. |
grant_type |
סוג האסימון המוחלף. בבקשות האלה,
מכיל את הערך urn:ietf:params:oauth:grant-type:jwt-bearer. |
assertion |
אסימון רשת מבוסס JSON (JWT) שמספק טענת נכוֹנוּת (assertion) חתומה של זהות המשתמש. ה-JWT מכיל מידע שכולל את שם המשתמש מספר חשבון Google, שם וכתובת אימייל. |
scope |
אופציונלי: היקפי הרשאות שהגדרתם ל-Google לבקש מהם משתמשים. |
client_id |
מזהה הלקוח שהקצית ל-Google. |
client_secret |
סוד הלקוח שהקצית ל-Google. |
כדי להגיב לבקשות Intent מסוג get, נקודת הקצה (endpoint) של המרת האסימונים חייבת לבצע את השלבים הבאים:
- לאמת ולפענח את טענת הנכוֹנוּת (assertion) של JWT.
- בודקים אם חשבון Google כבר קיים במערכת האימות.
אימות ופענוח של טענת הנכוֹנוּת (assertion) של JWT
אפשר לאמת ולפענח את טענת הנכוֹנוּת (assertion) של JWT באמצעות ספריית פענוח קוד JWT לשפה שלכם. כדאי להשתמש המפתחות הציבוריים של Google זמינים ב JWK או של PEM לצורך אימות לחתימה של האסימון.
אחרי הפענוח, טענת הנכוֹנוּת (assertion) של ה-JWT תיראה כמו הדוגמה הבאה:
{ "sub": "1234567890", // The unique ID of the user's Google Account "iss": "https://accounts.google.com", // The assertion's issuer "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID "iat": 233366400, // Unix timestamp of the assertion's creation time "exp": 233370000, // Unix timestamp of the assertion's expiration time "name": "Jan Jansen", "given_name": "Jan", "family_name": "Jansen", "email": "jan@gmail.com", // If present, the user's email address "email_verified": true, // true, if Google has verified the email address "hd": "example.com", // If present, the host domain of the user's GSuite email address // If present, a URL to user's profile picture "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ", "locale": "en_US" // User's locale, from browser or phone settings }
בנוסף לאימות החתימה של האסימון, צריך לוודא
מנפיק (השדה iss) הוא https://accounts.google.com, שהקהל
(השדה aud) הוא מזהה הלקוח שהוקצה לך, ושתוקף האסימון לא פג
(השדה exp).
באמצעות השדות email, email_verified ו-hd אפשר לקבוע אם
Google מארחת כתובת אימייל מסוימת, והיא מהימן. במקרים שבהם Google
מהימן, כרגע ידוע שהמשתמש הוא הבעלים החוקיים של החשבון
ותוכלו לדלג על סיסמה או על שיטות אחרות לאתגרים. אחרת, השיטות האלה
יכול לשמש לאימות החשבון לפני הקישור.
מקרים שבהם Google היא מהימן:
- ל-
emailיש סיומת@gmail.com. זהו חשבון Gmail. email_verifiedמוגדר כ-True ו-hdמוגדר. זהו חשבון G Suite.
משתמשים יכולים להירשם לחשבונות Google בלי להשתמש ב-Gmail או ב-G Suite. מתי
email לא מכיל סיומת @gmail.com ו-hd חסר Google
מומלץ לאמת סיסמה או סיסמה או שיטות אחרות לאימות
למשתמש. email_verified יכול להיות גם נכון כי Google אימתה בהתחלה את
משתמש כשחשבון Google נוצר, אבל בעלות על הצד השלישי
ייתכן שחשבון האימייל השתנה מאז.
בודקים אם חשבון Google כבר קיים במערכת האימות
בודקים אם אחד מהתנאים הבאים מתקיים:
- מספר חשבון Google, שנמצא בשדה
subבטענת הנכונות (assertion) שלך, נמצא אצל המשתמש. מסד נתונים. - כתובת האימייל בטענת הנכונות (assertion) תואמת למשתמש במסד הנתונים של המשתמשים.
אם נמצא חשבון למשתמש, מנפיקים אסימון גישה ומחזירים את הערכים באובייקט JSON בגוף תגובת ה-HTTPS, כמו בדוגמה הבאה:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
במקרים מסוימים, קישור חשבונות שמבוסס על אסימון מזהה עלול להיכשל עבור המשתמש. אם
מכל סיבה שהיא, נקודת הקצה של המרת אסימונים צריכה להשיב באמצעות HTTP
שגיאת 401 שמציינת error=linking_error, כמו בדוגמה הבאה:
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"error":"linking_error",
"login_hint":"foo@bar.com"
}
כש-Google מקבלת תגובה לשגיאה 401 עם linking_error, Google שולחת
המשתמש בנקודת הקצה של ההרשאה עם login_hint כפרמטר.
משתמש משלים את קישור החשבון באמצעות תהליך הקישור של OAuth בדפדפן שלו.
使用“使用 Google 账号登录”处理账号创建(创建 intent)
当用户需要在您的服务中创建账号时,Google 会向您的令牌交换端点发出请求,其中指定了 intent=create。
该请求采用以下形式:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded response_type=token&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=SCOPES&intent=create&assertion=JWT&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
您的令牌交换端点必须能够处理以下参数:
| 令牌端点参数 | |
|---|---|
intent |
对于这些请求,此参数的值为 create。 |
grant_type |
要交换的令牌的类型。对于这些请求,此
参数的值为 urn:ietf:params:oauth:grant-type:jwt-bearer。 |
assertion |
JSON 网络令牌 (JWT),用于提供 Google 用户身份的签名断言。JWT 包含的信息包括用户的 Google 账号 ID、姓名和电子邮件地址。 |
client_id |
您分配给 Google 的客户端 ID。 |
client_secret |
您分配给 Google 的客户端密钥。 |
assertion 参数中的 JWT 包含用户的 Google 账号 ID、姓名和电子邮件地址,您可以使用这些信息在您的服务中创建新账号。
如需响应 create intent 请求,您的令牌交换端点必须执行以下步骤:
- 验证 JWT 断言并对其进行解码。
- 验证用户信息并创建新账号。
אימות ופענוח של טענת הנכוֹנוּת (assertion) של JWT
אפשר לאמת ולפענח את טענת הנכוֹנוּת (assertion) של JWT באמצעות ספריית פענוח קוד JWT לשפה שלכם. כדאי להשתמש המפתחות הציבוריים של Google זמינים ב JWK או של PEM לצורך אימות לחתימה של האסימון.
אחרי הפענוח, טענת הנכוֹנוּת (assertion) של ה-JWT תיראה כמו הדוגמה הבאה:
{ "sub": "1234567890", // The unique ID of the user's Google Account "iss": "https://accounts.google.com", // The assertion's issuer "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID "iat": 233366400, // Unix timestamp of the assertion's creation time "exp": 233370000, // Unix timestamp of the assertion's expiration time "name": "Jan Jansen", "given_name": "Jan", "family_name": "Jansen", "email": "jan@gmail.com", // If present, the user's email address "email_verified": true, // true, if Google has verified the email address "hd": "example.com", // If present, the host domain of the user's GSuite email address // If present, a URL to user's profile picture "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ", "locale": "en_US" // User's locale, from browser or phone settings }
בנוסף לאימות החתימה של האסימון, צריך לוודא
מנפיק (השדה iss) הוא https://accounts.google.com, שהקהל
(השדה aud) הוא מזהה הלקוח שהוקצה לך, ושתוקף האסימון לא פג
(השדה exp).
באמצעות השדות email, email_verified ו-hd אפשר לקבוע אם
Google מארחת כתובת אימייל מסוימת, והיא מהימן. במקרים שבהם Google
מהימן, כרגע ידוע שהמשתמש הוא הבעלים החוקיים של החשבון
ותוכלו לדלג על סיסמה או על שיטות אחרות לאתגרים. אחרת, השיטות האלה
יכול לשמש לאימות החשבון לפני הקישור.
מקרים שבהם Google היא מהימן:
- ל-
emailיש סיומת@gmail.com. זהו חשבון Gmail. email_verifiedמוגדר כ-True ו-hdמוגדר. זהו חשבון G Suite.
משתמשים יכולים להירשם לחשבונות Google בלי להשתמש ב-Gmail או ב-G Suite. מתי
email לא מכיל סיומת @gmail.com ו-hd חסר Google
מומלץ לאמת סיסמה או סיסמה או שיטות אחרות לאימות
למשתמש. email_verified יכול להיות גם נכון כי Google אימתה בהתחלה את
משתמש כשחשבון Google נוצר, אבל בעלות על הצד השלישי
ייתכן שחשבון האימייל השתנה מאז.
验证用户信息并创建新账号
检查是否满足以下任一条件:
- 断言的
sub字段中找到的 Google 账号 ID 位于您的用户数据库中。 - 断言中的电子邮件地址与用户数据库中的用户匹配。
如果满足任一条件,请提示用户将其现有账号与其 Google 账号相关联。为此,请使用 HTTP 401 错误响应请求,该错误指定了
error=linking_error 并将用户的电子邮件地址作为 login_hint。以下是示例响应:
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"error":"linking_error",
"login_hint":"foo@bar.com"
}
当 Google 收到包含 linking_error 的 401 错误响应时,Google 会将用户发送到您的授权端点,并将 login_hint
作为参数。用户在其浏览器中使用 OAuth 关联流程完成账号关联。
如果这两个条件都不满足,请使用 JWT 中提供的信息创建新的用户账号。新账号通常没有设置密码。建议您将“使用 Google 账号登录”添加到其他平台,以便用户可以在应用的所有界面上使用 Google 账号登录。或者,您也可以通过电子邮件向用户发送一个链接,该链接会启动密码恢复流程,让用户设置密码以便在其他平台上登录。
创建完成后,请发出访问令牌 ,并在 HTTPS 响应正文中的 JSON 对象内返回这些值,如以下示例所示:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
איך מקבלים את מזהה הלקוח ב-Google API
במהלך תהליך ההרשמה לקישור החשבון, תצטרכו לספק את מזהה הלקוח של Google API.
כדי לקבל את מזהה הלקוח של ה-API באמצעות הפרויקט שיצרתם במהלך השלבים של קישור OAuth. כדי לעשות זאת, פועלים לפי השלבים הבאים:
- עוברים אל דף הלקוחות.
יוצרים פרויקט ב-Google APIs או בוחרים פרויקט קיים.
אם בפרויקט שלכם אין מזהה לקוח מסוג אפליקציית אינטרנט, לוחצים על יצירת לקוח כדי ליצור אחד. חשוב להוסיף את הדומיין של האתר לתיבה מקורות מורשים של JavaScript. כשמבצעים בדיקות מקומיות או פיתוח, צריך להוסיף את
http://localhostואתhttp://localhost:<port_number>לשדה מקורות JavaScript מורשים.
אימות ההטמעה
כדי לאמת את ההטמעה, אפשר להשתמש בכלי OAuth 2.0 Playground.
בכלי, מבצעים את השלבים הבאים:
- לוחצים על Configuration (הגדרה) כדי לפתוח את חלון ההגדרה של OAuth 2.0.
- בשדה OAuth flow (תהליך OAuth), בוחרים באפשרות Client-side (בצד הלקוח).
- בשדה OAuth Endpoints (נקודות קצה של OAuth), בוחרים באפשרות Custom (מותאם אישית).
- בשדות המתאימים, מציינים את נקודת הקצה של OAuth 2.0 ואת מזהה הלקוח שהקציתם ל-Google.
- בקטע Step 1, לא בוחרים אף היקף של Google. במקום זאת, משאירים את השדה הזה ריק או מקלידים היקף הרשאות שתקף לשרת (או מחרוזת שרירותית אם לא משתמשים בהיקפי הרשאות OAuth). בסיום, לוחצים על הרשאת ממשקי API.
- בקטעים שלב 2 ושלב 3, עוברים על תהליך ההרשאה באמצעות OAuth 2.0 ומוודאים שכל שלב פועל כמו שצריך.
כדי לאמת את ההטמעה, אפשר להשתמש בכלי Google Account Linking Demo.
בכלי, מבצעים את השלבים הבאים:
- לוחצים על הכפתור כניסה באמצעות חשבון Google.
- בוחרים את החשבון שרוצים לקשר.
- מזינים את מזהה השירות.
- אפשר להזין היקף אחד או יותר שרוצים לבקש גישה אליהם.
- לוחצים על התחלת ההדגמה.
- כשמופיעה הבקשה, מאשרים שרוצים להסכים לבקשת הקישור או לדחות אותה.
- מוודאים שמופנים לפלטפורמה שלכם.