總覽
以 OAuth 為基礎的「使用 Google 帳戶登入」簡化連結功能,會在OAuth 連結的基礎上新增「使用 Google 帳戶登入」功能。這項功能可為 Google 使用者提供流暢的帳戶連結體驗,並啟用帳戶建立功能,讓使用者透過 Google 帳戶在您的服務上建立新帳戶。
如要使用 OAuth 和「使用 Google 帳戶登入」功能連結帳戶,請按照下列一般步驟操作:
- 首先,請使用者同意存取他們的 Google 個人資料。
- 使用個人資料中的資訊,確認使用者帳戶是否存在。
- 如果是現有使用者,請連結帳戶。
- 如果驗證系統中沒有相符的 Google 使用者,請驗證從 Google 收到的 ID 權杖。然後,您可以根據 ID 權杖中包含的設定檔資訊建立使用者。
圖 1. 在使用者手機上透過簡化連結功能連結帳戶
簡化連結的相關規定
- 實作基本網頁 OAuth 連結流程。您的服務必須支援符合 OAuth 2.0 規範的授權和權杖交換端點。
- 您的權杖交換端點必須支援 JSON Web Token (JWT) 聲明,並實作
check、create和get意圖。
導入 OAuth 伺服器
您的權杖交換端點必須支援 check、create、get 意圖。請按照下列步驟完成帳戶連結流程,並瞭解何時會使用不同的意圖:
- 使用者是否在您的驗證系統中擁有帳戶?(使用者選取「是」或「否」來決定)
- 是:使用者是否使用與 Google 帳戶相關聯的電子郵件地址登入您的平台?(使用者選取「是」或「否」來決定)
- 是:使用者在您的驗證系統中是否有相符帳戶?(
check intent會呼叫以確認)- 是:如果取得意圖傳回成功,系統會呼叫
get intent並連結帳戶。 - 否:建立新帳戶?(使用者選取「是」或「否」來決定)
- 是:如果建立意圖傳回成功,系統會呼叫
create intent並連結帳戶。 - 否:系統會觸發網頁 OAuth 流程,將使用者導向瀏覽器,並提供連結至其他電子郵件地址的選項。
- 是:如果建立意圖傳回成功,系統會呼叫
- 是:如果取得意圖傳回成功,系統會呼叫
- 否:系統會觸發 Web OAuth 流程,將使用者導向瀏覽器,並提供連結至其他電子郵件的選項。
- 是:使用者在您的驗證系統中是否有相符帳戶?(
- 否:使用者在驗證系統中是否有相符的帳戶?(
check intent會呼叫以確認)- 是:如果取得意圖傳回成功,系統會呼叫
get intent並連結帳戶。 - 否:如果建立意圖傳回成功,系統會呼叫
create intent並連結帳戶。
- 是:如果取得意圖傳回成功,系統會呼叫
- 是:使用者是否使用與 Google 帳戶相關聯的電子郵件地址登入您的平台?(使用者選取「是」或「否」來決定)
檢查現有的使用者帳戶 (檢查意圖)
使用者同意存取自己的 Google 個人資料後,Google 會傳送 要求,包含已簽署的 Google 使用者身分識別資訊。 聲明包含使用者的 Google 帳戶 ID、 姓名、姓名和電子郵件地址為叢集設定的憑證交換端點 就會處理該要求
如果驗證資訊中已有對應的 Google 帳戶
系統,權杖交換端點會以 account_found=true 回應。如果
Google 帳戶與現有使用者不相符,您的權杖交換端點
會傳回 account_found=false 的 HTTP 404 找不到錯誤。
這項要求的格式如下:
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 Token (JWT),提供已簽署 識別使用者的身分JWT 所含資訊包括使用者的 Google 帳戶 ID、名稱和電子郵件地址。 |
client_id |
您指派給 Google 的用戶端 ID。 |
client_secret |
您指派給 Google 的用戶端密鑰。 |
如要回應 check 意圖要求,您的權杖交換端點必須執行下列步驟:
- 驗證並解碼 JWT 斷言。
- 檢查驗證系統是否已有 Google 帳戶。
驗證並解碼 JWT 斷言
您可以使用 適用於您語言的 JWT 解碼程式庫。使用 Google 的公開金鑰,位於 JWK 或 使用 PEM 格式進行驗證 憑證的簽章
解碼後的 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 欄位) 是您指派的用戶端 ID,且權杖尚未過期
(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 也可能是 true,因為 Google 一開始就驗證過
使用者就是 Google 帳戶建立時的使用者,但第三方的擁有權
電子郵件帳戶可能會有所變更。
檢查驗證系統是否已有 Google 帳戶
確認是否符合下列任一條件:
- 在聲明的「
sub」欄位中,有 Google 帳戶 ID 代表您的使用者 資料庫 - 斷言中的電子郵件地址與您使用者資料庫中的使用者相符。
如果其中一個條件為 true,使用者已經註冊。在此情況下 會傳回類似以下的回應:
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 會傳送 要求,包含已簽署的 Google 使用者身分識別資訊。 聲明包含使用者的 Google 帳戶 ID、 姓名、姓名和電子郵件地址為叢集設定的憑證交換端點 就會處理該要求
如果驗證資訊中已有對應的 Google 帳戶
系統,您的權杖交換端點會傳回使用者權杖。如果
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
您的權杖交換端點必須能處理下列參數:
| 權杖端點參數 | |
|---|---|
intent |
在這些要求中,這個參數的值為 get。 |
grant_type |
要交換的權杖類型。對於這些要求,這個
參數值為 urn:ietf:params:oauth:grant-type:jwt-bearer。 |
assertion |
JSON Web Token (JWT),提供已簽署 識別使用者的身分JWT 所含資訊包括使用者的 Google 帳戶 ID、名稱和電子郵件地址。 |
scope |
選用:您設為 Google 要求存取範圍的任何範圍 使用者。 |
client_id |
您指派給 Google 的用戶端 ID。 |
client_secret |
您指派給 Google 的用戶端密鑰。 |
如要回應 get 意圖要求,您的權杖交換端點必須執行下列步驟:
- 驗證並解碼 JWT 斷言。
- 檢查驗證系統是否已有 Google 帳戶。
驗證並解碼 JWT 斷言
您可以使用 適用於您語言的 JWT 解碼程式庫。使用 Google 的公開金鑰,位於 JWK 或 使用 PEM 格式進行驗證 憑證的簽章
解碼後的 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 欄位) 是您指派的用戶端 ID,且權杖尚未過期
(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 也可能是 true,因為 Google 一開始就驗證過
使用者就是 Google 帳戶建立時的使用者,但第三方的擁有權
電子郵件帳戶可能會有所變更。
檢查驗證系統是否已有 Google 帳戶
確認是否符合下列任一條件:
- 在聲明的「
sub」欄位中,有 Google 帳戶 ID 代表您的使用者 資料庫 - 斷言中的電子郵件地址與您使用者資料庫中的使用者相符。
如果找到使用者的帳戶,請核發存取權杖,並以 JSON 物件傳回 HTTPS 回應內文中的值,如以下範例所示:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
在某些情況下,根據 ID 權杖進行帳戶連結的使用者可能會失敗。如果是
因為無論出於什麼原因,您的權杖交換端點都必須以 HTTP
指定 error=linking_error 的 401 錯誤,如以下範例所示:
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"error":"linking_error",
"login_hint":"foo@bar.com"
}
當 Google 收到含有 linking_error 的 401 錯誤回應時,
將使用者傳送至您的授權端點,並以 login_hint 做為參數。
使用者在瀏覽器中使用 OAuth 連結流程完成帳戶連結。
使用「使用 Google 帳戶登入」處理帳戶建立作業 (建立意圖)
使用者需要在您的服務上建立帳戶時,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 Web Token (JWT),提供 Google 使用者身分的簽署聲明。JWT 包含使用者 Google 帳戶 ID、名稱和電子郵件地址等資訊。 |
client_id |
您指派給 Google 的用戶端 ID。 |
client_secret |
您指派給 Google 的用戶端密鑰。 |
assertion 參數中的 JWT 含有使用者的 Google 帳戶 ID、名稱和電子郵件地址,您可以使用這些資訊在服務中建立新帳戶。
如要回應 create 意圖要求,權杖交換端點必須執行下列步驟:
- 驗證並解碼 JWT 聲明。
- 驗證使用者資訊並建立新帳戶。
驗證並解碼 JWT 斷言
您可以使用 適用於您語言的 JWT 解碼程式庫。使用 Google 的公開金鑰,位於 JWK 或 使用 PEM 格式進行驗證 憑證的簽章
解碼後的 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 欄位) 是您指派的用戶端 ID,且權杖尚未過期
(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 也可能是 true,因為 Google 一開始就驗證過
使用者就是 Google 帳戶建立時的使用者,但第三方的擁有權
電子郵件帳戶可能會有所變更。
驗證使用者資訊並建立新帳戶
確認是否符合下列任一條件:
- 您可以在聲明中的
sub欄位找到 Google 帳戶 ID,這個 ID 位於使用者資料庫中。 - 判斷中的電子郵件地址與使用者資料庫中的使用者相符。
如果符合任一條件,請提示使用者將現有帳戶連結至 Google 帳戶。如要這麼做,請以指定 error=linking_error 的 HTTP 401 錯誤回應要求,並將使用者的電子郵件地址做為 login_hint。以下是回應範例:
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 連結流程完成帳戶連結。
如果上述任一條件不成立,請使用 JWT 中提供的資訊建立新的使用者帳戶。新帳戶通常不會設定密碼。建議您在其他平台上新增「使用 Google 帳戶登入」功能,讓使用者在應用程式的各個介面都能使用 Google 帳戶登入。或者,您也可以透過電子郵件傳送連結給使用者,啟動密碼救援流程,讓使用者設定密碼,以便在其他平台上登入。
建立完成後,請發出存取權杖 和更新權杖 ,並在 HTTPS 回應主體中以 JSON 物件形式傳回值,如下列範例所示:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
取得 Google API 用戶端 ID
在帳戶連結註冊程序中,您必須提供 Google API 用戶端 ID。
如要使用在完成「OAuth 連結」步驟時建立的專案取得 API 用戶端 ID,若要這樣做,請完成下列步驟:
- 前往「用戶端」頁面。
建立或選取 Google APIs 專案。
如果專案沒有「網頁應用程式」類型的用戶端 ID,請按一下「建立用戶端」建立。請務必在「已授權的 JavaScript 來源」方塊中加入網站網域。執行本機測試或開發作業時,您必須將
http://localhost和http://localhost:<port_number>都新增至「已授權的 JavaScript 來源」欄位。
驗證導入狀態
您可以使用 OAuth 2.0 Playground 工具驗證實作成果。
在工具中執行下列步驟:
- 點選「設定」 開啟「OAuth 2.0 設定」視窗。
- 在「OAuth flow」欄位中,選取「用戶端」。
- 在「OAuth Endpoints」(OAuth 端點) 欄位中,選取「Custom」(自訂)。
- 在對應欄位中,指定 OAuth 2.0 端點和您指派給 Google 的用戶端 ID。
- 在「步驟 1」部分,請勿選取任何 Google 範圍。請將這個欄位留空,或輸入適用於伺服器的範圍 (如果您未使用 OAuth 範圍,則輸入任意字串)。完成後,請按一下「授權 API」。
- 在「步驟 2」和「步驟 3」部分,請完成 OAuth 2.0 流程,並確認每個步驟都能正常運作。
您可以使用 Google 帳戶連結示範工具驗證實作項目。
在工具中執行下列步驟:
- 按一下「使用 Google 帳戶登入」按鈕。
- 選擇要連結的帳戶。
- 輸入服務 ID。
- 選擇性輸入您要要求存取的一或多個範圍。
- 按一下「開始試用」。
- 系統顯示提示時,確認您要同意或拒絕連結要求。
- 確認系統會將你重新導向至平台。