实现请求消息验证,确保发送到您的执行方式端点的“结账”和“提交订单”请求来自 Google,并防止未经授权的第三方调用您的端点。
使用 JWT 验证消息
出于安全考虑,从订购端到端服务器发送到您的执行方式端点的请求会在 Authorization
标头中包含已签名的 JSON Web 令牌 (JWT)。令牌由共享授权服务生成,Google 和您的执行方式端点实现可以调用该服务。
- Google 会使用授权服务和您的订餐项目的项目 ID 生成已签名的 JWT。
- Google 会将每个请求的
Authorization
标头中的签名令牌发送到您的执行方式端点。 - 您的端点必须使用 Google Auth 库对已签名的令牌进行解码。解码后的令牌包含项目 ID、颁发者、到期时间和颁发时间等详细信息。可以使用此数据确定请求的真实性。
要为您的项目实现请求验证,请按以下步骤操作:
- 从传入请求的
Authorization
标头中提取 JWT。 - 使用 Google Auth 库解码令牌。
- 将令牌的
audience
设置为您的项目 ID。 - 验证令牌载荷中包含的颁发者、项目 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"); }