帳戶連結會使用業界標準的 OAuth 2.0 隱含和授權碼流程。您的服務必須支援符合 OAuth 2.0 標準的授權和權杖交換端點。
在隐式流程中,Google 会在用户的浏览器中打开您的授权端点。成功登录后,您将向 Google 返回一个长期访问令牌。现在,此访问令牌会包含在 Google 发送的每个请求中。
在授权代码流程中,您需要两个端点:
授权端点,用于向尚未登录的用户显示登录界面。授权端点还会创建一个短期授权代码,以记录用户对所请求访问权限的同意情况。
令牌交换端点,负责两种类型的交换:
- 使用授权代码换取长期有效的刷新令牌和短期有效的访问令牌。当用户完成账号关联流程时,就会发生此交换。
- 将长期有效的刷新令牌换成短期有效的访问令牌。当 Google 需要新的访问令牌(因为现有访问令牌已过期)时,就会发生这种交换。
选择 OAuth 2.0 流程
虽然隐式流程更易于实现,但 Google 建议通过隐式流程签发的访问令牌永不过期。这是因为,在隐式流程中,令牌过期后,系统会强制用户重新关联其账号。如果您出于安全考虑需要令牌过期,我们强烈建议您改用授权码流程。
设计准则
本部分介绍了您为 OAuth 关联流程托管的用户屏幕的设计要求和建议。在 Google 应用调用该 API 后,您的平台会向用户显示登录 Google 页面和账号关联意见征求界面。同意关联账号后,系统会将用户重定向回 Google 的应用。

要求
- 您必须说明用户的账号将与 Google 相关联,而非 Google Home 或 Google 助理等特定 Google 产品相关联。
建议
建议您执行以下操作:
显示 Google 的隐私权政策。在同意屏幕上添加指向 Google 隐私权政策的链接。
要共享的数据。使用清晰简洁的语言告知用户 Google 需要哪些用户数据以及原因。
添加醒目的号召性用语。在用户同意页面上提供明确的号召性用语,例如“同意并关联”。这是因为用户需要了解他们需要与 Google 分享哪些数据才能关联账号。
可以取消。为用户提供返回或取消链接的途径,如果用户选择不进行关联。
明确的登录流程。确保用户有明确的 Google 账号登录方法,例如用户名和密码字段或使用 Google 账号登录。
能够解除关联。提供一种可让用户解除关联的机制,例如指向您平台上账号设置的网址。或者,您也可以添加指向 Google 账号的链接,以便用户管理其关联的账号。
能够更改用户账号。建议用户切换账号的方法。如果用户通常拥有多个账号,这种做法尤为有益。
- 如果用户必须关闭意见征求界面才能切换账号,请向 Google 发送可恢复的错误,以便用户可以使用 OAuth 关联和隐式流程登录所需的账号。
添加您的徽标。在意见征求页面上显示您的公司徽标。 按照您的样式准则放置徽标。如果您还想显示 Google 的徽标,请参阅徽标和商标。

建立專案
如要建立專案以使用帳戶連結,請按照下列步驟操作:
- 按一下 [Create Project]。
- 輸入名稱或接受系統產生的建議。
- 確認或編輯其餘欄位。
- 點選「建立」。
如要查看專案 ID,請按照下列步驟操作:
- 在到達網頁的表格中找出專案。專案 ID 會顯示在「ID」欄中。
設定 OAuth 同意畫面
Google 帳戶連結程序會顯示同意畫面,告知使用者要求存取資料的應用程式、要求存取的資料類型,以及適用條款。您必須先設定 OAuth 同意畫面,才能產生 Google API 用戶端 ID。
- 開啟 Google API 控制台的「OAuth 同意畫面」頁面。
- 如果出現提示,請選取您剛建立的專案。
在「OAuth 同意畫面」頁面中填寫表單,然後按一下「儲存」按鈕。
應用程式名稱:要求同意的應用程式名稱。名稱應如實反映應用程式,且與使用者在其他地方看到的應用程式名稱一致。應用程式名稱會顯示在帳戶連結同意畫面上。
應用程式標誌:同意畫面上的圖片,可協助使用者識別您的應用程式。標誌會顯示在帳戶連結同意畫面和帳戶設定頁面。
支援電子郵件地址:方便使用者與您聯絡,洽詢同意聲明相關事宜。
Google API 的範圍:範圍可讓應用程式存取使用者的私人 Google 資料。如果是 Google 帳戶連結用途,預設範圍 (電子郵件、個人資料、openid) 就已足夠,不需要新增任何敏感範圍。一般而言,最佳做法是在需要存取權時,逐步要求範圍,而非預先要求。瞭解詳情。
授權網域:為保障您與使用者的安全,Google 只允許應用程式透過 OAuth 驗證,使用授權網域。應用程式的連結必須託管於授權網域。瞭解詳情。
應用程式首頁連結:應用程式的首頁。必須託管在授權網域。
應用程式隱私權政策連結:顯示在 Google 帳戶連結同意畫面上。必須託管在授權網域。
應用程式服務條款連結 (選填):必須代管於授權網域。
圖 1. 虛構應用程式 Tunery 的 Google 帳戶連結同意畫面
查看「驗證狀態」,如果應用程式需要驗證,請點按「送交驗證」按鈕,將應用程式送交驗證。詳情請參閱 OAuth 驗證規定。
實作 OAuth 伺服器
如要支援 OAuth 2.0 隱含流程,服務會進行授權 並可透過 HTTPS 存取端點這個端點會負責驗證 徵得使用者同意,才能存取資料。授權端點 為使用者提供未登入並記錄登入的登入使用者介面 同意授予請求的存取權。
當 Google 應用程式需要呼叫服務的其中一個已授權 API 時, Google 會使用這個端點,向使用者取得呼叫這些 API 的權限 管理。
由 Google 發起的一般 OAuth 2.0 隱含流程工作階段,是 下列流程:
- Google 會在使用者的瀏覽器中開啟授權端點。 使用者登入 (如果尚未登入),並將權限授予 Google 透過您的 API 存取他們的資料 (如果尚未授予權限)。
- 您的服務會建立存取權杖,並傳回給 Google。若要這麼做,請將使用者的瀏覽器重新導向回 Google,並授予存取權 附加至請求的權杖
- Google 會呼叫服務的 API,並將存取權杖附加至 每個要求您的服務會確認存取權杖是否已授予 Google 授權存取 API,然後完成 API 呼叫。
處理授權要求
Google 應用程式需要透過 OAuth 2.0 進行帳戶連結時 隱含流程時,Google 會將使用者傳送至您的授權端點, ,其中包含下列參數:
授權端點參數 | |
---|---|
client_id |
您指派給 Google 的用戶端 ID。 |
redirect_uri |
您傳送回應到這項要求的網址。 |
state |
傳回給 Google 的記帳金額,值維持不變 重新導向 URI |
response_type |
要在回應中傳回的值類型。以 OAuth 2.0 隱含
回應類型則一律為 token 。 |
user_locale |
中的 Google 帳戶語言設定 RFC5646 將內容翻譯成使用者慣用的語言。 |
舉例來說,如果您的授權端點位於
https://myservice.example.com/auth
,要求可能如下所示:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token&user_locale=LOCALE
如要讓授權端點處理登入要求,請按照下列步驟操作: 步驟:
確認
client_id
和redirect_uri
的值如下: 防止授予非預期或設定錯誤的用戶端應用程式存取權:- 確認
client_id
與您用戶端 ID 相符 而是指派給 Google - 確認
redirect_uri
指定的網址 參數的格式如下:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
- 確認
檢查使用者是否已登入您的服務。如果使用者未簽署 的登入或申請流程。
產生供 Google 存取 API 的存取權杖。 存取權杖可以是任何字串值,但必須明確代表 以及該權杖適用的用戶端,且不可猜測。
傳送 HTTP 回應,將使用者的瀏覽器重新導向至網址 由
redirect_uri
參數指定。包含所有 網址片段中的下列參數:access_token
:您剛剛產生的存取權杖token_type
:字串bearer
state
:原始資料中未經修改的狀態值 要求
以下是最終網址的範例:
https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING
Google 的 OAuth 2.0 重新導向處理常式收到存取權杖並確認
state
值未變更。Google 取得
服務存取權杖,Google 會將該權杖附加到後續的呼叫
以便將 API 新增至 Service API
處理使用者資訊要求
userinfo 端點是 OAuth 2.0 受保護的資源,可傳回已連結使用者的聲明。除了下列用途外,不一定要實作並代管 userinfo 端點:
成功從權杖端點擷取存取權杖後,Google 會向您的使用者資訊端點傳送要求,以擷取已連結使用者的基本個人資料。
userinfo 端點要求標頭 | |
---|---|
Authorization header |
Bearer 類型的存取權杖。 |
舉例來說,如果您的 userinfo 端點位於
https://myservice.example.com/userinfo
,要求可能如下所示:
GET /userinfo HTTP/1.1 Host: myservice.example.com Authorization: Bearer ACCESS_TOKEN
為了讓 userinfo 端點處理要求,請按照下列步驟操作:
- 從授權標頭擷取存取權杖,然後為與存取權杖相關聯的使用者傳回資訊。
- 如果存取權杖無效,請使用
WWW-Authenticate
回應標頭傳回 HTTP 401 Unauthorized 錯誤。以下是 userinfo 錯誤回應的範例: 敬上 如果連結過程中傳回 401 未授權錯誤或其他失敗錯誤回應,將無法復原錯誤,擷取到的憑證將遭到捨棄,使用者必須再次啟動連結程序。HTTP/1.1 401 Unauthorized WWW-Authenticate: error="invalid_token", error_description="The Access Token expired"
如果存取權杖有效,則傳回並傳回 HTTP 200 回應,且 HTTPS 內文含有下列 JSON 物件 回應:
敬上 如果您的 userinfo 端點傳回 HTTP 200 成功回應,則會根據使用者的 Google 帳戶登錄擷取的權杖和憑證附加資訊。{ "sub": "USER_UUID", "email": "EMAIL_ADDRESS", "given_name": "FIRST_NAME", "family_name": "LAST_NAME", "name": "FULL_NAME", "picture": "PROFILE_PICTURE", }
userinfo 端點回應 sub
用來在系統中識別使用者的專屬 ID。 email
使用者的電子郵件地址。 given_name
選填:使用者的名字。 family_name
選填:使用者的姓氏。 name
選填:使用者全名。 picture
選用:使用者的個人資料相片。
驗證實作
您可以使用 OAuth 2.0 Playground 工具驗證實作結果。
請在工具中按照下列步驟操作:
- 點選「Configuration」圖示 ,開啟 OAuth 2.0 設定視窗。
- 在「OAuth 流程」欄位中,選取「用戶端」。
- 在「OAuth 端點」欄位中,選取「自訂」。
- 在對應的欄位中指定 OAuth 2.0 端點,以及您指派給 Google 的用戶端 ID。
- 在「步驟 1」部分中,請勿選取任何 Google 範圍。請改為將這個欄位留空,或輸入有效的伺服器範圍 (如果您不使用 OAuth 範圍,則輸入任意字串)。完成後,按一下「授權 API」。
- 在「步驟 2」和「步驟 3」部分,請完成 OAuth 2.0 流程,並確認每個步驟都能正常運作。
您可以使用 Google 帳戶連結示範工具驗證實作成果。
在工具中執行下列步驟:
- 按一下「使用 Google 帳戶登入」按鈕。
- 選擇要連結的帳戶。
- 輸入服務 ID。
- 您可以選擇輸入一或多個要申請存取權的範圍。
- 按一下「開始試用」。
- 系統顯示提示時,請確認您可以同意或拒絕連結要求。
- 確認系統是否會將你重新導向至平台。