Triển khai quy trình xác minh thông báo yêu cầu để đảm bảo rằng các yêu cầu Thanh toán và Gửi đơn đặt hàng đến điểm cuối thực hiện đơn hàng của bạn là từ Google và ngăn các bên thứ ba trái phép gọi điểm cuối của bạn.
Xác minh thông báo bằng JWT
Các yêu cầu đến điểm cuối thực hiện đơn hàng đến từ máy chủ Đặt hàng toàn diện chứa một Mã thông báo web JSON (JWT) đã ký trong tiêu đề Authorization
để bảo mật. Mã thông báo được tạo bởi một dịch vụ uỷ quyền dùng chung mà cả Google và điểm cuối thực hiện của bạn đều có thể gọi.
- Google tạo một JWT đã ký bằng cách sử dụng dịch vụ uỷ quyền và mã dự án của dự án Đặt món ăn.
- Google gửi mã thông báo đã ký trong tiêu đề
Authorization
của mọi yêu cầu đến điểm cuối thực hiện của bạn. - Điểm cuối của bạn phải giải mã mã thông báo đã ký bằng Thư viện xác thực của Google. Mã thông báo đã giải mã chứa các thông tin chi tiết như mã dự án, bên phát hành, thời gian hết hạn và thời gian phát hành. Sử dụng dữ liệu này để xác định tính xác thực của yêu cầu.
Để triển khai tính năng xác minh yêu cầu cho dự án, hãy làm theo các bước sau:
- Trích xuất JWT từ tiêu đề
Authorization
của các yêu cầu đến. - Giải mã mã thông báo bằng Thư viện xác thực của Google.
- Đặt
audience
của mã thông báo thành mã dự án. - Xác minh đơn vị phát hành, mã dự án và thông tin khác có trong tải trọng mã thông báo để đảm bảo tính chính xác.
Thư viện uỷ quyền của Google
Để xác minh các thông báo từ tính năng Đặt hàng toàn diện và tạo mã uỷ quyền cho các thông báo mà dịch vụ web của bạn gửi đến Google, hãy sử dụng Thư viện xác thực của Google bằng ngôn ngữ lập trình mà bạn chọn:
- Thư viện xác thực của Google cho Node.js
- Thư viện xác thực của Google cho Python
- Thư viện xác thực của Google cho Java
Tải và thêm một trong các thư viện này vào mã triển khai dịch vụ web.
Ví dụ về yêu cầu xác minh
Các ví dụ sau đây minh hoạ cách triển khai quy trình xác minh yêu cầu:
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"); }