實作要求訊息驗證,確保向你的訂單執行端點傳送的「結帳」和「提交訂單」要求來自 Google,並防止未經授權的第三方呼叫你的端點。
使用 JWT 驗證訊息
透過 Authorization
標頭傳送至訂單執行端點的要求,會包含已簽署的 JSON Web Token (JWT),以確保安全性。符記是由共用授權服務產生,Google 和執行端點實作項目皆可呼叫這項服務。
- Google 會使用授權服務和餐飲訂購專案的專案 ID 產生已簽署的 JWT。
- Google 會將已簽署的權杖傳送至每項要求的
Authorization
標頭,並傳送至您的執行要求端點。 - 端點必須使用 Google 驗證程式庫解碼已簽署的權杖。解碼的權杖包含專案 ID、發出者、到期時間和核發時間等詳細資料。使用這項資料來判斷要求的真實性。
如要為專案實作要求驗證,請按照下列步驟操作:
- 從傳入要求的
Authorization
標頭中擷取 JWT。 - 使用 Google 驗證程式庫解碼權杖。
- 將權杖的
audience
設為專案 ID。 - 驗證權杖酬載中所含的發出者、專案 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"); }