行動與電腦版應用程式的 OAuth 2.0

本文件說明安裝在手機、平板電腦和電腦等裝置上的應用程式,會如何使用 Google 的 OAuth 2.0 端點授權存取 YouTube Data API。

OAuth 2.0 可讓使用者與應用程式共用特定資料,同時保有使用者名稱、密碼和其他資訊的隱私。例如,應用程式可以使用 OAuth 2.0 取得權限,以將影片上傳到使用者的 YouTube 頻道。

已安裝的應用程式會發布至個別裝置,並假設這些應用程式無法保存密鑰。當使用者在使用應用程式時或應用程式在背景執行時,這些開發人員就能存取 Google API。

這項授權流程與用於網路伺服器應用程式的流程類似。主要差異在於已安裝的應用程式必須開啟系統瀏覽器,並提供本機重新導向 URI 來處理來自 Google 授權伺服器的回應。

替代方案

建議您針對行動應用程式採用 AndroidiOS 版的 Google 登入功能。Google 登入用戶端程式庫會處理驗證與使用者授權作業,而且相較於此處所述的較低層級通訊協定,這些程式庫的實作方式可能簡單。

如果應用程式是在不支援系統瀏覽器的裝置,或是具有有限輸入功能 (例如電視、遊戲主機、相機或印表機) 的裝置上運作,請參閱電視和裝置適用的 OAuth 2.0電視和有限輸入裝置適用的 OAuth 2.0

資料庫與示例

建議您使用下列程式庫和範例,以便實作本文所述的 OAuth 2.0 流程:

先備知識

為專案啟用 API

凡是呼叫 Google API 的應用程式,都必須在 API Console中啟用這些 API。

如何在專案中啟用 API:

  1. Google API Console中的Open the API Library
  2. If prompted, select a project, or create a new one.
  3. 在「資料庫」頁面中,找出並啟用 YouTube Data API。找出應用程式會使用的任何其他 API,並啟用這些 API。

建立授權憑證

凡是使用 OAuth 2.0 存取 Google API 的應用程式,都必須擁有授權憑證,可供 Google 的 OAuth 2.0 伺服器識別該應用程式。下列步驟說明如何為專案建立憑證。這樣一來,應用程式即可使用憑證存取您為專案啟用的 API。

  1. Go to the Credentials page.
  2. 按一下 [Create credentials] (建立憑證) > [OAuth client ID] (OAuth 用戶端 ID)
  3. 以下各節說明 Google 授權伺服器支援的用戶端類型和重新導向方法。選擇應用程式建議採用的用戶端類型,為 OAuth 用戶端命名,然後視情況設定其他表單欄位。
Android
  1. 選取「Android」應用程式類型。
  2. 輸入 OAuth 用戶端的名稱。這個名稱會顯示在專案的 Credentials page 上,以便識別用戶端。
  3. 輸入 Android 應用程式的套件名稱。您可以在應用程式資訊清單檔案的 <manifest> 元素的 package 屬性中定義這個值。
  4. 請輸入應用程式發布版本的 SHA-1 簽署憑證指紋。
    • 如果您的應用程式使用 Google Play 應用程式簽署功能,請從 Play 管理中心的應用程式簽署頁面複製 SHA-1 指紋。
    • 如果您管理自己的 KeyStore 和簽署金鑰,請使用 Java 隨附的 keytool 公用程式,以使用者容易理解的格式列印憑證資訊。複製 keytool 輸出內容的 Certificate fingerprints 區段中 SHA1 值。詳情請參閱 Android 版 Google API 中的驗證用戶端
  5. (選用) 驗證 Android 應用程式的擁有權
  6. 點選「Create」(建立)
iOS
  1. 選取「iOS」iOS應用程式類型。
  2. 輸入 OAuth 用戶端的名稱。這個名稱會顯示在專案的 Credentials page 上,以便識別用戶端。
  3. 輸入應用程式的軟體包 ID。軟體包 ID 是指應用程式資訊屬性清單資源檔案中的 CFBundleIdentifier 金鑰值 (info.plist)。這個值最常顯示在 Xcode 專案編輯器的「General」窗格或「Signing & Capabilities」窗格中。在 Apple App Store Connect 網站找到應用程式「應用程式資訊」頁面的「一般資訊」部分,也會顯示軟體包 ID。
  4. (選填)

    如果該應用程式是在 Apple 的 App Store 中發布,請輸入應用程式的 App Store ID。商店 ID 是出現在每個 Apple App Store 網址中的數字字串。

    1. 在 iOS 或 iPadOS 裝置上開啟 Apple App Store 應用程式
    2. 搜尋您的應用程式。
    3. 選取「分享」按鈕 (方形和向上箭頭)。
    4. 選取「複製連結」
    5. 將連結貼到文字編輯器中。網址的最終部分即為 App Store ID。

      範例:https://apps.apple.com/app/google/id284815942

  5. (選填)

    請輸入團隊 ID。詳情請參閱 Apple 開發人員帳戶說明文件中的「找出您的團隊 ID」一節。

  6. 點選「Create」(建立)
UWP
  1. 選取「Universal Windows Platform」應用程式類型。
  2. 輸入 OAuth 用戶端的名稱。這個名稱會顯示在專案的 Credentials page 上,以便識別用戶端。
  3. 輸入應用程式的 Microsoft Store ID (最多 12 個字元)。您可以在 Microsoft 合作夥伴中心的「應用程式身分」頁面中,找到「應用程式管理」專區的值。
  4. 點選「Create」(建立)

UWP 應用程式的自訂 URI 配置長度不得超過 39 個字元。

自訂 URI 配置 (Android、iOS、UWP)

自訂 URI 配置是一種深層連結,可使用自訂的配置開啟應用程式。

在 Android 上使用自訂 URI 配置的替代做法

您可以使用 Android SDK 專用 Google 登入,將 OAuth 2.0 回應直接傳送至應用程式,無需使用重新導向 URI。

如何改用 Android 版 Google 登入 SDK

如果您目前使用自訂配置在 Android 平台上進行 OAuth 整合,則必須完成下列操作,才能全面改用建議的 Android SDK 專用 Google 登入功能:

  1. 請更新程式碼以使用 Google 登入 SDK。
  2. 停止在 Google API 控制台中支援自訂配置。

請按照下列步驟遷移至 Google 登入 Android SDK:

  1. 更新程式碼即可使用 Google 登入 Android SDK:
    1. 檢查程式碼來找出您傳送要求至 Google OAuth 2.0 伺服器的位置;如果使用自訂配置,您的要求應如下所示:
        https://accounts.google.com/o/oauth2/v2/auth?
        scope=<SCOPES>&
        response_type=code&
        &state=<STATE>&
        redirect_uri=com.example.app:/oauth2redirect&
        client_id=<CLIENT_ID>
        
      com.example.app:/oauth2redirect 是上述範例的自訂配置重新導向 URI。如要進一步瞭解自訂 URI 配置值的格式,請參閱 redirect_uri 參數定義。
    2. 記下設定 Google 登入 SDK 所需的 scopeclient_id 要求參數。
    3. 按照 開始將 Google 登入整合至 Android 應用程式的操作說明設定 SDK。您可以略過「取得後端伺服器的 OAuth 2.0 用戶端 ID」步驟,重複使用您在上一個步驟中擷取的 client_id
    4. 按照 啟用伺服器端 API 存取權的操作說明進行。包括下列步驟:
      1. 請使用 getServerAuthCode 方法,針對您要要求權限的範圍擷取驗證碼。
      2. 將驗證碼傳送至應用程式後端,以交換存取和更新權杖。
      3. 使用擷取的存取權杖,代表使用者呼叫 Google API。
  2. 在 Google API 控制台中停用自訂配置的支援功能:
    1. 前往 OAuth 2.0 憑證清單,然後選取您的 Android 用戶端。
    2. 前往「進階設定」部分,取消勾選「啟用自訂 URI 配置」核取方塊,然後按一下「儲存」,即可停用自訂 URI 配置支援功能。
啟用自訂 URI 配置
如果建議的替代方案不適用於您的情況,請按照下列操作說明,為 Android 用戶端啟用自訂 URI 配置:
  1. 前往 OAuth 2.0 憑證清單,然後選取您的 Android 用戶端。
  2. 前往「進階設定」部分,勾選「啟用自訂 URI 配置」核取方塊,然後按一下「儲存」,即可啟用自訂 URI 配置支援功能。
在 Chrome 應用程式使用自訂 URI 配置的替代方案

您可以使用 Chrome Identity API,將 OAuth 2.0 回應直接提供給應用程式,無需使用重新導向 URI。

驗證應用程式擁有權 (Android、Chrome)

您可以驗證應用程式的擁有權,降低應用程式冒用身分的風險。

Android

如要完成驗證程序,您可以使用您的 Google Play 開發人員帳戶 (如果有的話),而且已在 Google Play 管理中心註冊應用程式。您必須符合下列規定才能成功通過驗證:

  • 您在 Google Play 管理中心註冊的應用程式,使用的套件名稱和 SHA-1 簽署憑證指紋,與要完成驗證程序的 Android OAuth 用戶端相同。
  • 您必須在 Google Play 管理中心擁有應用程式的「管理員」權限。進一步瞭解 Google Play 管理中心的存取權管理功能。

在 Android 用戶端的「驗證應用程式擁有權」部分中,按一下「驗證擁有權」按鈕完成驗證程序。

如果驗證成功,系統會顯示通知,確認驗證程序是否成功。否則,系統會顯示錯誤提示。

如要修正驗證失敗的問題,請按照下列步驟操作:

  • 請確認您要驗證的應用程式是 Google Play 管理中心的註冊應用程式。
  • 確認您在 Google Play 管理中心中擁有該應用程式的「管理員」權限。
Chrome

如要完成驗證程序,請使用 Chrome 線上應用程式商店開發人員帳戶。 您必須符合下列規定才能成功通過驗證:

  • 您必須在 Chrome 線上應用程式商店開發人員資訊主頁中完成已註冊的項目,其項目 ID 必須與要完成驗證程序的 Chrome 擴充功能 OAuth 用戶端相同。
  • 您必須是 Chrome 線上應用程式商店商品的發布者。 進一步瞭解 Chrome 線上應用程式商店開發人員資訊主頁的存取權管理機制。

在 Chrome 擴充功能用戶端的「驗證應用程式擁有權」部分中,按一下「驗證擁有權」按鈕完成驗證程序。

注意:在您授予帳戶存取權之後,請稍候幾分鐘,再完成驗證程序。

如果驗證成功,系統會顯示通知,確認驗證程序是否成功。否則,系統會顯示錯誤提示。

如要修正驗證失敗的問題,請按照下列步驟操作:

  • 確認 Chrome 線上應用程式商店開發人員資訊主頁中,列載的項目 ID 與您要完成驗證程序的 Chrome 擴充功能 OAuth 用戶端相同。
  • 請確認您是應用程式的發布者,也就是說,您必須是應用程式的發布者,或是應用程式的群組發布者。進一步瞭解如何在 Chrome 線上應用程式商店開發人員資訊主頁管理存取權。
  • 如果您剛更新群組發布者清單,請確認群組發布者名單是否已與 Chrome 線上應用程式商店開發人員資訊主頁保持同步。 進一步瞭解如何同步處理發布者會員清單。

回送 IP 位址 (macOS、Linux、Windows 桌面)

如要使用這個網址接收授權碼,應用程式必須監聽本機網路伺服器。適用範圍不多,但並非所有平台都適用。然而,如果您的平台支援,建議您使用這種方式取得授權碼。

應用程式收到授權回應後,為了獲得最佳可用性,應顯示 HTML 網頁來指示使用者關閉瀏覽器並返回應用程式。

建議用量 macOS、Linux 和 Windows 桌面 (但非通用 Windows 平台) 應用程式
表單值 將應用程式類型設為「電腦版應用程式」

手動複製/貼上

識別存取權範圍

範圍可讓應用程式僅要求存取其所需的資源,也能讓使用者控管他們授予應用程式的存取權量。因此,要求的範圍數量與取得使用者同意聲明的可能性可能存在相反關係。

開始實作 OAuth 2.0 授權之前,建議您找出應用程式需要權限存取的範圍。

YouTube Data API 第 3 版使用下列範圍:

狙擊鏡
https://www.googleapis.com/auth/youtube管理您的 YouTube 帳戶
https://www.googleapis.com/auth/youtube.channel-memberships.creator查看您現有的有效頻道會員清單,以及這些會員目前的級別和成為會員的時間點
https://www.googleapis.com/auth/youtube.force-ssl查看、編輯並永久刪除您的 YouTube 影片、評分、留言和字幕
https://www.googleapis.com/auth/youtube.readonly查看您的 YouTube 帳戶
https://www.googleapis.com/auth/youtube.upload管理您的 YouTube 影片
https://www.googleapis.com/auth/youtubepartner查看及管理您在 YouTube 上的元素和相關內容
https://www.googleapis.com/auth/youtubepartner-channel-audit查看您的 YouTube 頻道中與 YouTube 合作夥伴稽核程序相關的私人資訊

OAuth 2.0 API 範圍文件完整列出了可用於存取 Google API 的範圍。

取得 OAuth 2.0 存取權杖

下列步驟說明應用程式如何與 Google OAuth 2.0 伺服器互動,取得使用者的同意並代表使用者執行 API 要求。您的應用程式必須先取得同意,才能執行需要使用者授權的 Google API 要求。

步驟 1:產生程式碼驗證器和驗證問題

Google 支援 Code Exchange 金鑰證明 (PKCE) 通訊協定,讓已安裝的應用程式流程更加安全。系統會為每個授權要求建立專屬的程式碼驗證器,其轉換值 (稱為「code_challenge」) 會傳送至授權伺服器以取得授權碼。

建立程式碼驗證器

code_verifier 是使用未保留字元 [A-Z] / [a-z] / [0-9] / "-" / "." / "_" / "~" 的高熵加密隨機字串,長度至少為 43 個半形字元, 長度上限為 128 個字元。

程式碼驗證器應有足夠的熵,以致於無法猜測值。

建立代碼挑戰

系統支援兩種建立程式碼驗證方式的方法。

程式碼驗證產生方法
S256 (建議) 程式碼驗證問題是程式碼驗證器的 Base64URL (不含填充字元) 編碼 SHA256 雜湊。
code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
純白 程式碼驗證器的值與上方產生的程式碼驗證器相同。
code_challenge = code_verifier

步驟 2:將要求傳送到 Google 的 OAuth 2.0 伺服器

如要取得使用者授權,請透過 https://accounts.google.com/o/oauth2/v2/auth 將要求傳送至 Google 的授權伺服器。這個端點會處理執行中的工作階段查詢、驗證使用者身分,並取得使用者同意。端點只能透過 SSL 存取,且會拒絕 HTTP (非 SSL) 連線。

授權伺服器針對已安裝的應用程式支援下列查詢字串參數:

參數
client_id 必要

應用程式的用戶端 ID。您可以在 API Console Credentials page中找到這個值。

redirect_uri 必要

決定 Google 的授權伺服器向應用程式傳送回應的方式。已安裝的應用程式可使用多種重新導向選項,您也在設定授權憑證時,需要考慮特定的重新導向方式。

這個值必須與您在用戶端 API Console Credentials page中設定的 OAuth 2.0 用戶端授權重新導向 URI 完全相符。如果這個值與授權 URI 不符,您會收到 redirect_uri_mismatch 錯誤。

下表顯示了每個方法的適當 redirect_uri 參數值:

redirect_uri 個值
自訂 URI 配置 com.example.app:redirect_uri_path

com.googleusercontent.apps.123:redirect_uri_path
  • com.example.app 是您控管的網域的反向 DNS 標記。自訂配置必須包含一個句號,才算有效。
  • com.googleusercontent.apps.123 是用戶端 ID 的反向 DNS 標記法。
  • redirect_uri_path 是選用的路徑元件,例如 /oauth2redirect。請注意,路徑應以單一斜線開頭,這與一般 HTTP 網址不同。
回送 IP 位址 http://127.0.0.1:porthttp://[::1]:port

向平台查詢相關的回送 IP 位址,並在隨機的可用通訊埠啟動 HTTP 事件監聽器。請將 port 替換成應用程式監聽的實際通訊埠編號。

請注意,我們已 已淘汰,在行動應用程式上使用回送 IP 位址重新導向選項。

response_type 必要

決定 Google OAuth 2.0 端點是否傳回授權碼。

如果是已安裝的應用程式,請將參數值設為 code

scope 必要

以空格分隔的範圍清單,這些範圍會識別應用程式可以代表使用者存取的資源。這些值會通知 Google 向使用者顯示的同意畫面。

範圍可讓應用程式僅要求存取所需的資源,也能讓使用者控管他們授予應用程式的存取權量。因此,要求的範圍數量與取得使用者同意聲明的可能性之間存在相反關係。

YouTube Data API 第 3 版使用下列範圍:

狙擊鏡
https://www.googleapis.com/auth/youtube管理您的 YouTube 帳戶
https://www.googleapis.com/auth/youtube.channel-memberships.creator查看您現有的有效頻道會員清單,以及這些會員目前的級別和成為會員的時間點
https://www.googleapis.com/auth/youtube.force-ssl查看、編輯並永久刪除您的 YouTube 影片、評分、留言和字幕
https://www.googleapis.com/auth/youtube.readonly查看您的 YouTube 帳戶
https://www.googleapis.com/auth/youtube.upload管理您的 YouTube 影片
https://www.googleapis.com/auth/youtubepartner查看及管理您在 YouTube 上的元素和相關內容
https://www.googleapis.com/auth/youtubepartner-channel-audit查看您的 YouTube 頻道中與 YouTube 合作夥伴稽核程序相關的私人資訊

OAuth 2.0 API 範圍文件提供完整的範圍清單,可讓您存取 Google API。

code_challenge 建議採用

指定編碼後的 code_verifier,在授權碼交換期間用做伺服器端驗證。詳情請參閱上方的「建立程式碼驗證問題」一節。

code_challenge_method 建議採用

指明在授權碼交換期間使用的 code_verifier 編碼方法。這個參數必須與上述的 code_challenge 參數搭配使用。如果要求中未出現 code_challengecode_challenge_method 的值會預設為 plain。這個參數僅支援 S256plain 值。

state 建議採用

指定應用程式用來維持授權要求與授權伺服器回應之間狀態的任何字串值。使用者同意或拒絕應用程式的存取要求後,伺服器會透過 redirect_uri 的網址片段 ID (#) 傳回您以 name=value 組合形式傳送的確切值。

您可以將這個參數用於多種用途,例如將使用者導向至應用程式中的正確資源、傳送 Nonce,以及降低跨網站要求的偽造情形。由於 redirect_uri 可以猜測,因此使用 state 值可讓您保證傳入連線是因驗證要求而產生的結果。如果您產生隨機字串或對 Cookie 雜湊或其他擷取用戶端狀態的值進行編碼,則您可以驗證回應,另外確保要求和回應源自相同的瀏覽器,提供防範跨網站要求偽造這類攻擊的防護措施。如需如何建立並確認 state 權杖的範例,請參閱 OpenID Connect 說明文件。

login_hint 選用

如果應用程式知道想要驗證的使用者,可使用此參數來提示 Google 驗證伺服器。伺服器會在登入表單中預先填入電子郵件欄位,或選取適當的多登入工作階段,並根據提示簡化登入流程。

將參數值設為電子郵件地址或 sub ID,這相當於使用者的 Google ID。

授權網址範例

下列分頁顯示不同重新導向 URI 選項的授權網址範例。

每個網址都要求存取範圍,以允許存取使用者的 YouTube 帳戶。

這些網址都相同,但 redirect_uri 參數的值除外。網址也包含必要的 response_typeclient_id 參數,以及選用的 state 參數。每個網址都含有換行符號和方便閱讀的空格。

自訂 URI 配置

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&
 response_type=code&
 state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken&
 redirect_uri=com.example.app%3A/oauth2redirect&
 client_id=client_id

回送 IP 位址

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&
 response_type=code&
 state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken&
 redirect_uri=http%3A//127.0.0.1%3A9004&
 client_id=client_id

步驟 3:Google 會提示使用者同意

在這個步驟中,使用者決定是否授予應用程式要求的存取權。在這個階段,Google 會顯示同意視窗,其中顯示您的應用程式名稱,以及本身透過使用者的授權憑證要求取得權限的 Google API 服務,並大致說明要授予的存取權範圍。然後,使用者就可以同意授予應用程式要求一或多個範圍的存取權,或是拒絕要求。

應用程式會等待來自 Google OAuth 2.0 伺服器的回應,並指出是否已獲得任何存取權,因此在這個階段無須採取任何行動。該回應會在下列步驟中說明。

錯誤

向 Google 的 OAuth 2.0 授權端點發出的要求可能會顯示要向使用者顯示的錯誤訊息,而非預期的驗證和授權流程。以下列出常見的錯誤代碼和建議解決方法。

admin_policy_enforced

Google 帳戶無法授權一或多個要求的範圍,因此無法授權給這個 Google Workspace 管理員的政策。請參閱 Google Workspace 管理員說明文章「 控管哪些第三方應用程式和內部應用程式可存取 Google Workspace 資料」一文,進一步瞭解系統管理員如何限制所有範圍,或是敏感和受限制範圍的存取權,直到 OAuth 用戶端 ID 明確授予存取權為止。

disallowed_useragent

授權端點會顯示在 Google 的 OAuth 2.0 政策禁止的內嵌使用者代理程式中。

Android

android.webkit.WebView 中開啟授權要求時,Android 開發人員可能會看到這則錯誤訊息。開發人員應改用 Android 程式庫,例如 Android 專用 Google 登入或 OpenID Foundation 的 Android 適用的 AppAuth

當 Android 應用程式透過內嵌的使用者代理程式開啟一般網頁連結,且使用者從您的網站前往 Google 的 OAuth 2.0 授權端點時,網頁開發人員可能就會發生這個錯誤。開發人員應允許在作業系統的預設連結處理常式 (包括 Android 應用程式連結處理常式或預設的瀏覽器應用程式) 中開啟一般連結。您也可以使用 Android 自訂分頁程式庫。

iOS

iOS 和 macOS 開發人員在 WKWebView 中開啟授權要求時,可能會發生這個錯誤。開發人員應改用 iOS 程式庫,例如 iOS 專用 Google 登入或 OpenID Foundation 的 AppAuth for iOS

當 iOS 或 macOS 應用程式透過內嵌的使用者代理程式開啟一般網路連結,且使用者從您的網站前往 Google 的 OAuth 2.0 授權端點時,網頁開發人員可能就會發生這個錯誤。開發人員應允許在作業系統的預設連結處理常式中開啟一般連結,包括通用連結處理常式或預設的瀏覽器應用程式。您也可以使用 SFSafariViewController 程式庫。

org_internal

要求中的 OAuth 用戶端 ID 屬於某項專案,可限制特定 Google Cloud 機構對 Google 帳戶的存取權限。如要進一步瞭解這項設定選項,請參閱「設定 OAuth 同意畫面」說明文章中的「使用者類型」一節。

invalid_grant

如果您使用的是程式碼驗證器和驗證方式,則 code_callenge 參數無效或遺失。確認 code_challenge 參數設定正確無誤。

重新整理存取權杖時,權杖可能已過期或失效。 再次驗證使用者,並要求使用者同意取得新的權杖。如果持續看到這個錯誤,請確認應用程式設定正確無誤,且在要求中使用正確的權杖和參數。否則,該使用者帳戶可能已遭刪除或停用。

redirect_uri_mismatch

授權要求中傳遞的 redirect_uri 與 OAuth 用戶端 ID 的授權重新導向 URI 不符。查看 Google API Console Credentials page中已授權的重新導向 URI。

傳遞的 redirect_uri 可能不適用於用戶端類型。

redirect_uri 參數可能是指 OAuth 外架構 (OOB) 流程,但該流程已淘汰且不再受支援。如要更新整合作業,請參閱遷移指南

invalid_request

您提出的要求發生問題。可能原因如下:

  • 要求的格式不正確
  • 要求中缺少必要參數
  • 這項要求使用了 Google 不支援的授權方法。確認 OAuth 整合功能使用建議的整合方法
  • 重新導向 URI 使用的是自訂配置:如果系統顯示「Chrome 應用程式不支援自訂 URI 配置」或「您的 Android 用戶端未啟用自訂 URI 配置」錯誤訊息,表示您使用的自訂 URI 配置不適用於 Chrome 應用程式,且在 Android 上預設為停用。進一步瞭解自訂 URI 配置替代方案

步驟 4:處理 OAuth 2.0 伺服器回應

應用程式收到授權回應的方式,取決於您使用的重新導向 URI 配置。無論配置為何,回應都會包含授權碼 (code) 或錯誤 (error)。舉例來說,error=access_denied 表示使用者拒絕要求。

如果使用者授予應用程式存取權,您就能按照下一個步驟所述,用授權碼交換存取權杖和更新權杖。

步驟 5:交換重新整理及存取權杖的授權碼

如要用授權碼交換存取權杖,請呼叫 https://oauth2.googleapis.com/token 端點並設定下列參數:

欄位
client_id 從 API Console Credentials page取得的用戶端 ID。
client_secret 從 API Console Credentials page取得的用戶端密鑰。
code 初始要求傳回的授權碼。
code_verifier 您在步驟 1 中建立的程式碼驗證器。
grant_type 根據 OAuth 2.0 規格所定義,這個欄位的值必須設為 authorization_code
redirect_uri 在 API Console Credentials page 中,為指定 client_id 列出的專案其中一個重新導向 URI。

下列程式碼片段為要求範例:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=http://127.0.0.1:9004&
grant_type=authorization_code

Google 傳回 JSON 物件,其中包含短期存取權杖和更新權杖,藉此回應這項要求。

回應中會包含以下欄位:

欄位
access_token 您的應用程式為授權 Google API 要求而傳送的憑證。
expires_in 存取權杖的剩餘生命週期 (以秒為單位)。
id_token 注意:只有在要求包含識別資訊範圍 (例如 openidprofileemail) 時,才會傳回這項屬性。這個值是 JSON Web Token (JWT),其中包含經過數位簽署的使用者身分識別資訊。
refresh_token 可用來取得新的存取權杖的憑證。重新整理權杖會持續有效,直到使用者撤銷存取權為止。請注意,已安裝的應用程式一律會傳回重新整理權杖。
scope access_token 授予的存取權範圍,以空格分隔且區分大小寫的字串清單表示。
token_type 傳回的權杖類型。目前,這個欄位的值一律會設為 Bearer

以下程式碼片段為回應範例:

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "token_type": "Bearer",
  "scope": "https://www.googleapis.com/auth/youtube.force-ssl",
  "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
}

呼叫 Google API

應用程式取得存取權杖後,在獲得 API 所需的存取權範圍後,您即可使用權杖,代表指定使用者帳戶呼叫 Google API。如要這麼做,請在對 API 的要求中加入存取權杖,方法是加入 access_token 查詢參數或 Authorization HTTP 標頭 Bearer 值。如果可以的話,建議使用 HTTP 標頭,因為查詢字串通常會顯示在伺服器記錄檔中。在大部分的情況下,您都可以使用用戶端程式庫,設定對 Google API 的呼叫 (例如呼叫 YouTube Data API 時)。

請注意,YouTube Data API 僅支援擁有及管理多個 YouTube 頻道的 YouTube 內容擁有者 (例如唱片公司和電影公司) 的服務帳戶。

如要試用所有 Google API 及查看其範圍,請前往 OAuth 2.0 Playground

HTTP GET 範例

使用 Authorization: Bearer HTTP 標頭呼叫 youtube.channels 端點 (YouTube Data API) 的呼叫可能如下所示。請注意,您必須指定自己的存取權杖:

GET /youtube/v3/channels?part=snippet&mine=true HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

以下示範如何使用 access_token 查詢字串參數,為通過驗證的使用者呼叫相同的 API:

GET https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true

curl 個樣本

您可以使用 curl 指令列應用程式測試這些指令。以下為使用 HTTP 標頭選項的範例 (建議):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true

或者,您也可以使用查詢字串參數選項:

curl https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true

重新整理存取權杖

存取權杖會定期過期,並成為相關 API 要求的無效憑證。如果您要求存取與權杖相關聯的範圍,則可以重新整理存取權杖,而無須提示使用者授予權限 (包括沒有使用者時)。

為了重新整理存取權杖,應用程式會將 HTTPS POST 要求傳送至 Google 的授權伺服器 (https://oauth2.googleapis.com/token),其中包含下列參數:

欄位
client_id API Console取得的用戶端 ID。
client_secret API Console取得的用戶端密鑰。 (client_secret 不適用於註冊為 Android、iOS 或 Chrome 應用程式的用戶端發出的要求。)
grant_type OAuth 2.0 規格所定義,這個欄位的值必須設為 refresh_token
refresh_token 授權碼交換時傳回的更新權杖。

下列程式碼片段為要求範例:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=your_client_id&
client_secret=your_client_secret&
refresh_token=refresh_token&
grant_type=refresh_token

只要使用者尚未撤銷授予應用程式的存取權,憑證伺服器就會傳回內含新存取權杖的 JSON 物件。以下程式碼片段為回應範例:

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
  "token_type": "Bearer"
}

請注意,系統即將核發的更新權杖數量有限制;每個用戶端/使用者組合各有一項限制,所有用戶端對每位使用者另有限制。建議您將更新權杖儲存在長期儲存空間,只要該權杖維持有效狀態,就能繼續使用。如果您的應用程式要求過多的更新權杖,可能會達到這些限制,而較舊的更新權杖就會停止運作。

撤銷權杖

在某些情況下,使用者可能會希望撤銷應用程式的存取權。使用者可以透過 帳戶設定撤銷存取權。詳情請參閱「針對具有您帳戶存取權的第三方網站和應用程式,移除網站或應用程式存取權」支援說明文件。

應用程式也可能會透過程式撤銷授予的存取權。在使用者取消訂閱、移除應用程式或應用程式所需的 API 資源發生大幅變更的情況下,程式輔助撤銷程序非常重要。也就是說,移除程序的一部分可以包含 API 要求,確保先前授予應用程式的權限已移除。

如要透過程式輔助方式撤銷權杖,應用程式會向 https://oauth2.googleapis.com/revoke 發出要求,並在參數中加入權杖:

curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
        https://oauth2.googleapis.com/revoke?token={token}

可以是存取權杖或更新權杖。如果權杖是存取權杖,且有對應的更新權杖,系統也會撤銷更新權杖。

如果撤銷成功處理,回應的 HTTP 狀態碼會是 200。如果是錯誤狀況,會傳回 HTTP 狀態碼 400 和錯誤代碼。

延伸閱讀

適用於原生應用程式的 OAuth 2.0 最佳做法」「IETF 現行最佳做法」提供本文所述的許多最佳做法。