授權與驗證

實作要求訊息驗證,確保向你的訂單執行端點傳送的「結帳」和「提交訂單」要求來自 Google,並防止未經授權的第三方呼叫你的端點。

使用 JWT 驗證訊息

透過 Authorization 標頭傳送至訂單執行端點的要求,會包含已簽署的 JSON Web Token (JWT),以確保安全性。符記是由共用授權服務產生,Google 和執行端點實作項目皆可呼叫這項服務。

  1. Google 會使用授權服務和餐飲訂購專案的專案 ID 產生已簽署的 JWT。
  2. Google 會將已簽署的權杖傳送至每項要求的 Authorization 標頭,並傳送至您的執行要求端點。
  3. 端點必須使用 Google 驗證程式庫解碼已簽署的權杖。解碼的權杖包含專案 ID、發出者、到期時間和核發時間等詳細資料。使用這項資料來判斷要求的真實性。

如要為專案實作要求驗證,請按照下列步驟操作:

  1. 從傳入要求的 Authorization 標頭中擷取 JWT。
  2. 使用 Google 驗證程式庫解碼權杖。
  3. 將權杖的 audience 設為專案 ID。
  4. 驗證權杖酬載中所含的發出者、專案 ID 和其他資訊是否正確無誤。

Google 授權程式庫

如要驗證端對端訂購的訊息,並為網路服務傳送給 Google 的訊息產生授權碼,請使用您偏好的程式語言中的 Google 驗證程式庫:

下載並將其中一個程式庫新增至您的網路服務實作程式碼。

要求驗證範例

以下範例說明如何實作要求驗證:

Node.js

const auth = require('google-auth-library')
const authClient = new auth.OAuth2Client()

/**
 * Verifies that an incoming request came from Google.
 * @param {String} idToken - The ID token used to verify the request
 * (i.e. The value found in the Authorization header of an incoming request).
 * @param {String} audience - The expected audience of the request
 * (i.e. The project ID for your project).
 * @return {boolean} True if request came from Google, false otherwise.
 */
function isRequestFromGoogle(idToken, audience) {
  authClient.verifyIdToken({idToken, audience}, (err, info) => {
    return !(err || info['iss'] !== 'https://accounts.google.com')
  })
}
    

Python

from google.oauth2 import id_token
from google.auth.transport import requests

def isRequestFromGoogle(audience, token):
    """ Verifies that an incoming request came from Google.

    Args:
        audience (str): The expected audience of the request
                        (i.e. The project ID for your project)
        token (str): The ID token used to verify the request
                     (i.e. The value found in the Authorization
                     header of an incoming request)
    Returns:
        True if the request came from Google, False otherwise.
    """
    id_info = id_token.verify_oauth2_token(token, requests.Request(), audience)
    return id_info['iss'] == 'https://accounts.google.com'
    

Java

/**
 * Verifies that an incoming request came from Google.
 * @param audience The expected audience of the request
 *                 (i.e. The project ID for your project)
 * @param token The ID token used to verify the request
 *              (i.e. The value found in the Authorization
 *              header of an incoming request)
 * @return {@code true} if request is from Google, else {@code false}
 */
public boolean isRequestFromGoogle(String audience, String token) {
  GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier
      .Builder(transport, jsonFactory)
      .setAudience(Collections.singletonList(audience))
      .build();

  GoogleIdToken idToken = verifier.verify(token);
  if (idToken == null) return false;
  Payload payload = idToken.getPayload();
  String issuer = (String) payload.get("iss");
  return issuer.equals("https://accounts.google.com");
}