Uỷ quyền và xác minh

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.

  1. 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.
  2. 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.
  3. Đ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:

  1. Trích xuất JWT từ tiêu đề Authorization của các yêu cầu đến.
  2. Giải mã mã thông báo bằng Thư viện xác thực của Google.
  3. Đặt audience của mã thông báo thành mã dự án.
  4. 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:

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