用戶端網頁應用程式適用的 OAuth 2.0

本文件說明如何實作 OAuth 2.0 授權,以透過 JavaScript 網頁應用程式存取 Google API。OAuth 2.0 可讓使用者與應用程式共用特定資料,同時保有使用者名稱、密碼和其他資訊的隱私。舉例來說,應用程式可以透過 OAuth 2.0 取得使用者授權,讓他們將檔案儲存在 Google 雲端硬碟中。

這個 OAuth 2.0 流程稱為隱含授權流程。這個設計適用於僅在使用者位於應用程式的情況下,可存取 API 的應用程式。這些應用程式無法儲存機密資訊。

在此流程中,應用程式會開啟一個 Google 網址,透過查詢參數識別您的應用程式,以及應用程式所需的 API 存取權類型。您可以在目前的瀏覽器視窗或彈出式視窗中開啟該網址。使用者可以透過 Google 進行驗證,並授予要求的權限。接著,Google 會將使用者重新導向回應用程式。重新導向過程包含存取權杖,應用程式會驗證該權杖,再用來發出 API 要求。

Google API 用戶端程式庫和 Google Identity 服務

如果您使用 JavaScript 專用的 Google API 用戶端程式庫向 Google 進行授權呼叫,則應使用 Google Identity 服務 JavaScript 程式庫處理 OAuth 2.0 流程。請參閱 Google Identity Services 的權杖模型,這是以 OAuth 2.0 的隱含授予流程為基礎。

必要條件

為專案啟用 API

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

如何為專案啟用 API:

  1. Open the API Library (位於 Google API Console)。
  2. If prompted, select a project, or create a new one.
  3. API Library 會列出所有可用的 API,依產品系列和熱門程度分組。如果清單中未顯示您想啟用的 API,請使用搜尋功能尋找該 API,或在其所屬的產品系列中按一下「View All」
  4. 選取要啟用的 API,然後按一下「Enable」按鈕。
  5. If prompted, enable billing.
  6. If prompted, read and accept the API's Terms of Service.

建立授權憑證

任何使用 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. 選取「Web application」(網頁應用程式) 應用程式類型。
  4. 完整填寫表單。如果應用程式使用 JavaScript 提出已獲授權的 Google API 要求,則必須指定已授權的 JavaScript 來源。來源會指出應用程式可將要求傳送至 OAuth 2.0 伺服器的網域。這些來源必須遵循 Google 的驗證規則

識別存取權範圍

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

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

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

取得 OAuth 2.0 存取權杖

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

步驟 1:重新導向至 Google 的 OAuth 2.0 伺服器

如要要求存取使用者資料的權限,請將使用者重新導向至 Google 的 OAuth 2.0 伺服器。

OAuth 2.0 端點

產生網址,以便在 https://accounts.google.com/o/oauth2/v2/auth 的 Google OAuth 2.0 端點要求存取權。這個端點可透過 HTTPS 存取;系統會拒絕純 HTTP 連線。

Google 授權伺服器支援下列網路伺服器應用程式:

參數
client_id 必要

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

redirect_uri 必要

決定 API 伺服器在使用者完成授權流程後,將使用者重新導向的位置。這個值必須與 OAuth 2.0 用戶端的其中一個已授權重新導向 URI 完全相符,而您在用戶端的 API Console Credentials page中設定該用戶端。如果這個值與所提供 client_id 的授權重新導向 URI 不相符,就會傳回 redirect_uri_mismatch 錯誤。

請注意,httphttps 配置、大小寫和結尾的斜線 (「/」) 必須全部相符。

response_type 必要

JavaScript 應用程式必須將參數值設為 token。這個值會指示 Google 授權伺服器在完成授權程序後,將使用者重新導向的 URI 片段 ID (#) 中,以 name=value 組合的形式傳回存取權杖。

scope 必要

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

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

建議您讓應用程式盡可能在相關情境下要求存取授權範圍。透過漸進式授權,在使用者情境中要求存取使用者資料,有助於使用者更輕鬆地瞭解應用程式需要取得存取權的原因。

state 建議

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

這項參數可用於多種用途,例如將使用者導向應用程式中的正確資源、傳送 Nonce,以及減少跨網站要求偽造情形。由於 redirect_uri 可以被猜到,使用 state 值可以加強保證傳入連線是驗證要求的結果。如果您產生隨機字串,或對 Cookie 或其他擷取用戶端狀態的值進行編碼,則您可以驗證回應,藉此另外確保要求和回應是來自同一個瀏覽器,藉此防範跨網站要求偽造行為等攻擊。如需建立並確認 state 權杖的範例,請參閱 OpenID Connect 說明文件。

include_granted_scopes 選用

可讓應用程式使用漸進式授權功能,在情境中要求存取其他範圍。如果將這個參數的值設為 true,並授予授權要求,新的存取權杖也會涵蓋使用者先前授予應用程式存取權的所有範圍。如需範例,請參閱漸進式授權一節。

login_hint 選用

如果應用程式知道要驗證哪位使用者,就能使用這個參數向 Google 驗證伺服器提供提示。伺服器會使用提示來簡化登入流程,方法是在登入表單中預先填入電子郵件欄位,或是選取適當的多登入工作階段。

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

prompt 選用

顯示使用者的提示清單 (以空格分隔且區分大小寫)。如未指定這個參數,系統只會在專案第一次要求存取權時提示使用者。詳情請參閱「 提示重新取得同意聲明」一文。

可能的值為:

none 請勿顯示任何驗證畫面或同意畫面。不得與其他值指定。
consent 提示使用者表示同意。
select_account 提示使用者選取帳戶。

重新導向至 Google 授權伺服器的範例

以下提供範例網址,其中含有換行符號和空格,方便閱讀。

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 include_granted_scopes=true&
 response_type=token&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

建立要求網址後,將使用者重新導向至該網址。

JavaScript 程式碼範例

下列 JavaScript 程式碼片段說明如何在不使用 JavaScript 的 Google API 用戶端程式庫的情況下,以 JavaScript 啟動授權流程。這個 OAuth 2.0 端點不支援跨源資源共享 (CORS),因此程式碼片段會建立表單,用於開啟該端點的要求。

/*
 * Create form to request access token from Google's OAuth 2.0 server.
 */
function oauthSignIn() {
  // Google's OAuth 2.0 endpoint for requesting an access token
  var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

  // Create <form> element to submit parameters to OAuth 2.0 endpoint.
  var form = document.createElement('form');
  form.setAttribute('method', 'GET'); // Send as a GET request.
  form.setAttribute('action', oauth2Endpoint);

  // Parameters to pass to OAuth 2.0 endpoint.
  var params = {'client_id': 'YOUR_CLIENT_ID',
                'redirect_uri': 'YOUR_REDIRECT_URI',
                'response_type': 'token',
                'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
                'include_granted_scopes': 'true',
                'state': 'pass-through value'};

  // Add form parameters as hidden input values.
  for (var p in params) {
    var input = document.createElement('input');
    input.setAttribute('type', 'hidden');
    input.setAttribute('name', p);
    input.setAttribute('value', params[p]);
    form.appendChild(input);
  }

  // Add form to page and submit it to open the OAuth 2.0 endpoint.
  document.body.appendChild(form);
  form.submit();
}

步驟 2:Google 提示使用者表示同意

在這個步驟中,使用者可決定是否要將要求的存取權授予應用程式。在這個階段,Google 會顯示同意視窗,當中會顯示應用程式的名稱,以及應用程式向使用者授權憑證要求存取的 Google API 服務,以及授予存取權的範圍摘要。然後,使用者就可以同意授予應用程式要求的一或多個範圍的存取權,或是拒絕要求。

在這個階段中,應用程式會等候 Google OAuth 2.0 伺服器的回應,指出是否已授予任何存取權,因此您不需要採取任何行動。該回應會在下一個步驟中說明。

錯誤

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

admin_policy_enforced

基於其 Google Workspace 管理員的政策,Google 帳戶無法授權給一或多個要求的範圍。如要進一步瞭解管理員如何限制存取所有範圍,或是機密和受限制範圍的存取權,請參閱 Google Workspace 管理員說明文章「 控管哪些第三方應用程式和內部應用程式可存取 Google Workspace 資料」。

disallowed_useragent

授權端點會顯示在 Google OAuth 2.0 政策不允許的嵌入使用者代理程式中。

Android

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

如果 Android 應用程式在內嵌使用者代理程式中開啟一般網頁連結,且使用者從您的網站前往 Google 的 OAuth 2.0 授權端點,就可能遇到這個錯誤。開發人員應允許在作業系統的預設連結處理常式中開啟一般連結,包括 Android 應用程式連結處理常式或預設的瀏覽器應用程式。此外,我們也支援「Android 自訂分頁」程式庫。

iOS

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

如果 iOS 或 macOS 應用程式在內嵌使用者代理程式中開啟一般網頁連結,而使用者從您的網站前往 Google 的 OAuth 2.0 授權端點,就可能遇到這個錯誤。開發人員應允許在作業系統的預設連結處理常式中開啟一般連結,包括通用連結處理常式或預設的瀏覽器應用程式。此外,我們也支援 SFSafariViewController 程式庫選項。

org_internal

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

invalid_client

提出要求的來源未獲為此用戶端授權。請參閱 origin_mismatch

invalid_grant

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

origin_mismatch

產生授權要求的 JavaScript 配置、網域和/或通訊埠,可能與向 OAuth 用戶端 ID 註冊的授權 JavaScript 來源 URI 不符。請查看 Google API Console Credentials page中已授權的 JavaScript 來源。

redirect_uri_mismatch

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

產生授權要求的 JavaScript 配置、網域和/或通訊埠,可能與向 OAuth 用戶端 ID 註冊的授權 JavaScript 來源 URI 不符。請查看 Google API Console Credentials page中已授權的 JavaScript 來源。

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

invalid_request

您提交的要求有錯誤。可能的原因如下:

  • 要求格式不正確
  • 要求中缺少必要參數
  • 要求使用了 Google 不支援的授權方法。使用建議的整合方法驗證 OAuth 整合作業

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

OAuth 2.0 端點

OAuth 2.0 伺服器會將回應傳送至您在存取權杖要求中指定的 redirect_uri

如果使用者核准了要求,回應內便會提供存取權杖。如果使用者並未核准要求,回應內便會提供錯誤訊息。存取權杖或錯誤訊息會在重新導向 URI 的雜湊片段上傳回,如下所示:

  • 存取權杖回應:

    https://oauth2.example.com/callback#access_token=4/P7q7W91&token_type=Bearer&expires_in=3600

    除了 access_token 參數以外,片段字串也包含 token_type 參數 (一律設為 Bearer),以及用來指定權杖生命週期 (以秒為單位) 的 expires_in 參數。如果存取權杖要求中指定了 state 參數,該參數的值也會包含在回應中。

  • 錯誤回應:
    https://oauth2.example.com/callback#error=access_denied

OAuth 2.0 伺服器回應範例

您可以點選以下範例網址來測試這個流程,該網址會要求取得 Google 雲端硬碟中檔案中繼資料的唯讀存取權:

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 include_granted_scopes=true&
 response_type=token&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

完成 OAuth 2.0 流程後,系統會將您重新導向至 http://localhost/oauth2callback。除非本機電腦當時正透過該位址提供檔案,否則該網址會產生 404 NOT FOUND 錯誤。下一個步驟將詳細說明當使用者重新導向回應用程式時,URI 中傳回的資訊。

呼叫 Google API

OAuth 2.0 端點

應用程式取得存取權杖後,如果您已獲得 API 所需的存取權範圍,就能使用權杖代表指定使用者帳戶呼叫 Google API。方法是加入 access_token 查詢參數或 Authorization HTTP 標頭 Bearer 值,在向 API 發出的要求中加入存取權杖。請盡可能使用 HTTP 標頭,因為查詢字串通常會顯示在伺服器記錄中。在多數情況下,您可以使用用戶端程式庫設定對 Google API 的呼叫 (例如呼叫 Drive Files API 時)。

您可以在 OAuth 2.0 Playground 試用所有 Google API 並查看其範圍。

HTTP GET 範例

使用 Authorization: Bearer HTTP 標頭呼叫 drive.files 端點 (Drive Files API) 時,看起來可能如下所示。請注意,您必須指定自己的存取權杖:

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

以下示範使用 access_token 查詢字串參數,為已驗證使用者呼叫同一個 API:

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

curl 範例

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

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

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

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

JavaScript 程式碼範例

以下程式碼片段示範如何使用 CORS (跨來源資源共享) 將要求傳送至 Google API。這個範例未使用 JavaScript 的 Google API 用戶端程式庫。不過,即使您並未使用用戶端程式庫,也能透過該程式庫說明文件中的 CORS 支援指南進一步瞭解這些要求。

在這個程式碼片段中,access_token 變數代表您取得並代表授權使用者發出 API 要求的憑證。完整範例示範如何將該權杖儲存在瀏覽器的本機儲存空間,並在提出 API 要求時擷取該憑證。

var xhr = new XMLHttpRequest();
xhr.open('GET',
    'https://www.googleapis.com/drive/v3/about?fields=user&' +
    'access_token=' + params['access_token']);
xhr.onreadystatechange = function (e) {
  console.log(xhr.response);
};
xhr.send(null);

完整範例

OAuth 2.0 端點

這個程式碼範例示範如何在不使用 JavaScript 的 Google API 用戶端程式庫的情況下,以 JavaScript 完成 OAuth 2.0 流程。此程式碼適用於 HTML 網頁,會顯示試用 API 要求的按鈕。如果您點選按鈕,程式碼會檢查該頁面是否已將 API 存取權杖儲存在瀏覽器的本機儲存空間中。如果是的話,系統會執行 API 要求。否則,系統會啟動 OAuth 2.0 流程。

如果是 OAuth 2.0 流程,頁面按照下列步驟操作:

  1. 這會將使用者導向 Google 的 OAuth 2.0 伺服器,而伺服器會要求存取 https://www.googleapis.com/auth/drive.metadata.readonly 範圍。
  2. 授予 (或拒絕) 一或多個要求範圍的存取權後,系統會將使用者重新導向至原始網頁,該網頁剖析片段 ID 字串中的存取權杖。
  3. 網頁會使用存取權杖提出 API 範例要求。

    API 要求會呼叫 Drive API 的 about.get 方法,擷取授權使用者 Google 雲端硬碟帳戶的相關資訊。

  4. 如果要求成功執行,API 回應就會記錄在瀏覽器的偵錯主控台中。

您可以透過 Google 帳戶的「權限」頁面,撤銷應用程式的存取權。應用程式將列為 Google API 文件的 OAuth 2.0 示範

如要在本機執行這段程式碼,您必須為對應至授權憑證YOUR_CLIENT_IDYOUR_REDIRECT_URI 變數設定值。YOUR_REDIRECT_URI 變數應設為提供網頁的網址。這個值必須與您在 API Console Credentials page中設定的 OAuth 2.0 用戶端授權重新導向 URI 完全相符。如果這個值與已授權的 URI 不相符,您會收到 redirect_uri_mismatch 錯誤。您的專案也必須針對此要求啟用適當的 API

<html><head></head><body>
<script>
  var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
  var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';
  var fragmentString = location.hash.substring(1);

  // Parse query string to see if page request is coming from OAuth 2.0 server.
  var params = {};
  var regex = /([^&=]+)=([^&]*)/g, m;
  while (m = regex.exec(fragmentString)) {
    params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }
  if (Object.keys(params).length > 0) {
    localStorage.setItem('oauth2-test-params', JSON.stringify(params) );
    if (params['state'] && params['state'] == 'try_sample_request') {
      trySampleRequest();
    }
  }

  // If there's an access token, try an API request.
  // Otherwise, start OAuth 2.0 flow.
  function trySampleRequest() {
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    if (params && params['access_token']) {
      var xhr = new XMLHttpRequest();
      xhr.open('GET',
          'https://www.googleapis.com/drive/v3/about?fields=user&' +
          'access_token=' + params['access_token']);
      xhr.onreadystatechange = function (e) {
        if (xhr.readyState === 4 && xhr.status === 200) {
          console.log(xhr.response);
        } else if (xhr.readyState === 4 && xhr.status === 401) {
          // Token invalid, so prompt for user permission.
          oauth2SignIn();
        }
      };
      xhr.send(null);
    } else {
      oauth2SignIn();
    }
  }

  /*
   * Create form to request access token from Google's OAuth 2.0 server.
   */
  function oauth2SignIn() {
    // Google's OAuth 2.0 endpoint for requesting an access token
    var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

    // Create element to open OAuth 2.0 endpoint in new window.
    var form = document.createElement('form');
    form.setAttribute('method', 'GET'); // Send as a GET request.
    form.setAttribute('action', oauth2Endpoint);

    // Parameters to pass to OAuth 2.0 endpoint.
    var params = {'client_id': YOUR_CLIENT_ID,
                  'redirect_uri': YOUR_REDIRECT_URI,
                  'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
                  'state': 'try_sample_request',
                  'include_granted_scopes': 'true',
                  'response_type': 'token'};

    // Add form parameters as hidden input values.
    for (var p in params) {
      var input = document.createElement('input');
      input.setAttribute('type', 'hidden');
      input.setAttribute('name', p);
      input.setAttribute('value', params[p]);
      form.appendChild(input);
    }

    // Add form to page and submit it to open the OAuth 2.0 endpoint.
    document.body.appendChild(form);
    form.submit();
  }
</script>

<button onclick="trySampleRequest();">Try sample request</button>
</body></html>

JavaScript 來源驗證規則

Google 會將下列驗證規則套用至 JavaScript 來源,協助開發人員確保應用程式安全無虞。JavaScript 來源必須遵循這些規則。如要瞭解網域、主機和配置的定義,請參閱 RFC 3986 第 3 節

驗證規則
配置

JavaScript 來源必須使用 HTTPS 架構,而非純 HTTP。本機主機 URI (包括 localhost IP 位址 URI) 不受這項規則影響。

主機

主機不能是原始 IP 位址。本機主機 IP 位址不受這項規則的限制。

網域
  • 主機 TLD (頂層網域) 必須屬於公開字尾清單
  • 主機網域不得為 “googleusercontent.com”
  • 除非應用程式擁有網域,否則 JavaScript 來源不得包含網址縮短工具網域 (例如 goo.gl)。
  • 使用者資訊

    JavaScript 來源不得包含使用者資訊子元件。

    路徑

    JavaScript 來源不得包含路徑元件。

    查詢

    JavaScript 來源不得包含查詢元件。

    Fragment

    JavaScript 來源不得包含片段元件。

    字元 JavaScript 來源不得包含特定字元,包括:
    • 萬用字元字元 ('*' 個)
    • 不可列印的 ASCII 字元
    • 百分比編碼無效 (任何百分比編碼不符合百分比符號網址編碼格式,後接兩個十六進位數字)
    • 空值字元 (經編碼的空值字元,例如%00%C0%80)

    增量授權

    在 OAuth 2.0 通訊協定中,您的應用程式要求存取以範圍識別的資源。建議您在需要時要求資源授權,這是最佳的使用者體驗做法。為提供這項做法,Google 的授權伺服器支援漸進式授權。這項功能可讓您視需要要求範圍,且若使用者授予新範圍的權限,則會傳回授權碼,供權杖使用,其中包含使用者授予專案的所有範圍。

    舉例來說,如果應用程式會讓使用者取樣音樂曲目及建立合輯,在使用者登入時可能只需要少量資源,甚至可能只有登入者的姓名。不過,如要儲存已完成的組合,您需要存取 Google 雲端硬碟。一般而言,只有在應用程式實際需要時,使用者才要求存取 Google 雲端硬碟,往往會顯得自然。

    在這種情況下,應用程式可能會在登入時要求 openidprofile 範圍來執行基本登入,然後在第一次要求時要求 https://www.googleapis.com/auth/drive.file 範圍以儲存組合。

    下列規則適用於透過漸進式授權取得的存取權杖:

    • 這些權杖可用於存取新合併授權中任一範圍對應的資源。
    • 使用更新憑證取得存取權杖時,存取權杖代表合併的授權,且可用於回應中的任一 scope 值。
    • 合併授權涵蓋使用者授予 API 專案的所有範圍,即使授權是來自不同用戶端也一樣。舉例來說,如果使用者使用應用程式的桌面用戶端授予某個範圍的存取權,接著透過行動裝置用戶端將另一個範圍授予同一個應用程式,則合併的授權會同時包含這兩個範圍。
    • 如果您撤銷代表合併授權的權杖,系統會同時撤銷所有代表相關使用者存取該項授權範圍的存取權。

    以下程式碼範例說明如何為現有存取權杖新增範圍。這種做法可讓應用程式省去管理多個存取權杖的麻煩。

    OAuth 2.0 端點

    如要為現有存取權杖新增範圍,請在傳送至 Google OAuth 2.0 伺服器的要求中加入 include_granted_scopes 參數。

    下列程式碼片段示範如何執行這項操作。程式碼片段假設您已將存取權杖的有效範圍儲存在瀏覽器的本機儲存空間中。(完整範例程式碼會在瀏覽器的本機儲存空間中設定 oauth2-test-params.scope 屬性,以儲存存取權杖的有效範圍清單)。

    這個程式碼片段會將存取權杖的有效範圍與您特定查詢所使用的範圍進行比較。如果存取權杖未涵蓋該範圍,OAuth 2.0 流程就會啟動。這裡的 oauth2SignIn 函式與步驟 2 中提供的函式相同 (稍後會在完整範例中提供)。

    var SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly';
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    
    var current_scope_granted = false;
    if (params.hasOwnProperty('scope')) {
      var scopes = params['scope'].split(' ');
      for (var s = 0; s < scopes.length; s++) {
        if (SCOPE == scopes[s]) {
          current_scope_granted = true;
        }
      }
    }
    
    if (!current_scope_granted) {
      oauth2SignIn(); // This function is defined elsewhere in this document.
    } else {
      // Since you already have access, you can proceed with the API request.
    }

    撤銷權杖

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

    應用程式也可能會透過程式輔助方式撤銷存取權。若是使用者取消訂閱、移除應用程式,或者應用程式所需 API 資源已大幅變更,程式輔助撤銷就相當重要。也就是說,移除程序的部分內容可能包含 API 要求,確保先前授予應用程式的權限均已移除。

    OAuth 2.0 端點

    如要透過程式撤銷權杖,應用程式會向 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,以及錯誤代碼。

    下列 JavaScript 程式碼片段說明如何在不使用 JavaScript 專用 Google API 用戶端程式庫的情況下,透過 JavaScript 撤銷權杖。由於用於撤銷權杖的 Google 的 OAuth 2.0 端點不支援跨來源資源共享 (CORS),因此程式碼會建立表單並將表單提交到端點,而不是使用 XMLHttpRequest() 方法發布要求。

    function revokeAccess(accessToken) {
      // Google's OAuth 2.0 endpoint for revoking access tokens.
      var revokeTokenEndpoint = 'https://oauth2.googleapis.com/revoke';
    
      // Create <form> element to use to POST data to the OAuth 2.0 endpoint.
      var form = document.createElement('form');
      form.setAttribute('method', 'post');
      form.setAttribute('action', revokeTokenEndpoint);
    
      // Add access token to the form so it is set as value of 'token' parameter.
      // This corresponds to the sample curl request, where the URL is:
      //      https://oauth2.googleapis.com/revoke?token={token}
      var tokenField = document.createElement('input');
      tokenField.setAttribute('type', 'hidden');
      tokenField.setAttribute('name', 'token');
      tokenField.setAttribute('value', accessToken);
      form.appendChild(tokenField);
    
      // Add form to page and submit it to actually revoke the token.
      document.body.appendChild(form);
      form.submit();
    }