授权和验证

实现请求消息验证,以确保发送到您的履单端点的结账和提交订单请求来自 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 授权库

如需从订购端到端验证消息,并为您的 Web 服务发送给 Google 的消息生成授权代码,请使用您选择的编程语言中的 Google Auth 库:

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

请求验证示例

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

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