授权和验证

实现请求消息验证,确保发送到您的执行方式端点的“结账”和“提交订单”请求来自 Google,并防止未经授权的第三方调用您的端点。

使用 JWT 验证消息

出于安全考虑,从订购端到端服务器发送到您的执行方式端点的请求会在 Authorization 标头中包含已签名的 JSON Web 令牌 (JWT)。令牌由共享授权服务生成,Google 和您的执行方式端点实现可以调用该服务。

  1. Google 会使用授权服务和您的订餐项目的项目 ID 生成已签名的 JWT。
  2. Google 会将每个请求的 Authorization 标头中的签名令牌发送到您的执行方式端点。
  3. 您的端点必须使用 Google Auth 库对已签名的令牌进行解码。解码后的令牌包含项目 ID、颁发者、到期时间和颁发时间等详细信息。可以使用此数据确定请求的真实性。

要为您的项目实现请求验证,请按以下步骤操作:

  1. 从传入请求的 Authorization 标头中提取 JWT。
  2. 使用 Google Auth 库解码令牌。
  3. 将令牌的 audience 设置为您的项目 ID。
  4. 验证令牌载荷中包含的颁发者、项目 ID 和其他信息以确保准确性。

Google 授权库

如需验证来自“端到端订购”的消息,并为网络服务发送给 Google 的消息生成授权代码,请以您选择的编程语言使用 Google Auth 库:

下载其中一个库并将其添加到您的网络服务实现代码中。

请求验证示例

以下示例演示了如何实现请求验证:

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");
}