帳戶是透過業界標準的 OAuth 2.0 授權碼流程連結。
代理程式適用的 OAuth 2.1 和 PKCE
對於無狀態 AI 代理程式和多模態管道,建議強制執行 OAuth 2.1。
- PKCE (用於程式碼交換的金鑰證明):必須用於保護授權碼流程,防止攔截攻擊。
- 沒有隱含流程:隱含流程會在網址中公開存取權杖, 這會對代理程式環境造成安全風險。
您的服務必須支援符合 OAuth 2.0/2.1 規範的授權和權杖交換端點。
建立專案
如要建立專案以使用帳戶連結,請按照下列步驟操作:
- 前往 Google API 控制台。
- 按一下 [Create Project]。
- 輸入名稱或接受系統產生的建議。
- 確認或編輯其餘欄位。
- 點選「建立」。
如要查看專案 ID,請按照下列步驟操作:
- 前往 Google API 控制台。
- 在到達網頁的表格中找出專案。專案 ID 會顯示在「ID」欄中。
設定 OAuth 同意畫面
Google 帳戶連結程序會顯示同意畫面,告知使用者要求存取資料的應用程式、要求存取的資料類型,以及適用條款。您必須先設定 OAuth 同意畫面,才能產生 Google API 用戶端 ID。
- 開啟 Google API 控制台的「OAuth consent screen」(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 授权代码流程
以下序列图详细说明了用户、Google 和您服务的端点之间的互动。
角色和职责
下表定义了 Google 账号关联 (GAL) OAuth 流中各个参与者的角色和职责。请注意,在 GAL 中,Google 充当 OAuth 客户端,而您的服务充当身份/服务提供方。
| 执行者 / 组件 | GAL 角色 | 职责 |
|---|---|---|
| Google 应用 / 服务器 | OAuth 客户端 | 启动流程,接收授权代码,将其换成令牌,并安全地存储这些令牌以访问服务的 API。 |
| 您的授权端点 | 授权服务器 | 对用户进行身份验证,并征得用户同意,允许 Google 访问其数据。 |
| 您的令牌交换端点 | 授权服务器 | 验证授权代码和刷新令牌,并向 Google 服务器发放访问令牌。 |
| Google 重定向 URI | 回调端点 | 从您的授权服务接收包含 code 和 state 值的用户重定向。 |
由 Google 发起的 OAuth 2.0 授权代码流程会话具有以下流程:
- Google 会在用户的浏览器中打开您的授权端点。如果流程在仅支持语音的设备上针对某项操作启动,Google 会将执行转移到手机。
- 用户登录(如果尚未登录),并授予 Google 权限以通过您的 API 访问其数据(如果尚未授予权限)。
- 您的服务会创建授权代码并将其返回给 Google。为此,请将用户的浏览器重定向回 Google,并在请求中附上授权代码。
- Google 会将授权代码发送到您的令牌交换端点,该端点会验证代码的真实性,并返回访问令牌和刷新令牌。访问令牌是一种短期有效的令牌,您的服务会将其作为访问 API 的凭据来接受。刷新令牌是一种长期有效的令牌,Google 可以存储该令牌,并在访问令牌过期时使用该令牌获取新的访问令牌。
- 用户完成账号关联流程后,Google 发送的每个后续请求都包含一个访问令牌。
实施方案
请按照以下步骤实现授权代码流程。
第 1 步:处理授权请求
当 Google 启动账号关联时,会将用户重定向到您的授权端点。如需详细了解协议合约和参数要求,请参阅授权端点。
如需处理此请求,请执行以下操作:
验证请求:
- 确认
client_id与分配给 Google 的客户端 ID 一致。 - 确认
redirect_uri与预期的 Google 重定向网址一致:- Prod:
https://oauth-redirect.googleusercontent.com/r/YOUR_PARTNER_ID - 沙盒:
https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PARTNER_ID
- Prod:
- 验证
response_type是否为code。
- 确认
对用户进行身份验证:
- 检查用户是否已登录您的服务。
- 如果用户未登录,请提示他们完成登录或注册流程。
生成授权代码:
- 创建与用户和客户端关联的唯一且无法猜测的授权代码。
- 将验证码的失效时间设置为大约 10 分钟。
重定向回 Google:
- 将浏览器重定向到
redirect_uri中提供的网址。 - 附加以下查询参数:
code:您生成的授权代码。state:从 Google 收到的未修改的状态值。
- 将浏览器重定向到
第 2 步:处理令牌交换请求
您的令牌交换端点会处理两种类型的请求:将代码换成令牌,以及刷新过期的访问令牌。如需详细了解协议合约和参数要求,请参阅令牌交换端点。
A. 将授权代码兑换为令牌
当 Google 收到授权代码时,会调用您的令牌交换端点 (POST) 以检索令牌。
验证请求:
- 验证
client_id和client_secret。 - 验证授权代码是否有效且未过期。
- 确认
redirect_uri与第 1 步中使用的值一致。 - 如果验证失败,则返回带有
{"error": "invalid_grant"}的 HTTP400 Bad Request。
- 验证
发放令牌:
- 生成长期有效的
refresh_token和短期有效的access_token(通常为 1 小时)。 - 返回包含标准 JSON 令牌响应的 HTTP
200 OK。
- 生成长期有效的
B. 刷新访问令牌
当访问令牌过期时,Google 会使用刷新令牌请求新的访问令牌。
验证请求:
- 验证
client_id、client_secret和refresh_token。 - 如果验证失败,则返回带有
{"error": "invalid_grant"}的 HTTP400 Bad Request。
- 验证
签发新的访问令牌:
- 生成新的短期
access_token。 - 返回包含 JSON 令牌响应(可以选择性地包含新的刷新令牌)的 HTTP
200 OK。
- 生成新的短期
處理使用者資訊要求
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 工具驗證實作成果。
在工具中執行下列步驟:
- 點選「設定」 開啟「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。
- 選擇性輸入您要要求存取的一或多個範圍。
- 按一下「開始試用」。
- 系統顯示提示時,確認您要同意或拒絕連結要求。
- 確認系統會將你重新導向至平台。