授权和验证

实现请求消息验证,以确保结帐和提交订单请求来自 Google 履单端点,并防止未经授权的第三方调用您的端点。

使用 JWT 验证消息

出于安全原因,从 Order with Google 服务器向 fulfillment 端点发出的请求会在 Authorization 标头中包含已签名的 JSON 网络令牌 (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 授权库

如需验证来自 Order with 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");
}