Ủy quyền và xác minh

Triển khai tính năng xác minh thông báo yêu cầu để đảm bảo rằng 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 đến từ Google và ngăn chặn các bên thứ ba trái phép gọi điểm cuối của bạn.

Xác minh tin nhắn bằng JWT

Các yêu cầu đến điểm cuối thực hiện được gửi từ máy chủ Order with Google sẽ 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ụ ủy quyền chung mà cả Google và phương thức triển khai điểm cuối thực hiện của bạn sẽ gọi.

  1. Google tạo một JWT đã ký bằng dịch vụ ủy quyền và mã dự án của dự án Đặt món ăn của bạn.
  2. Google sẽ 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 mã 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 được giải mã chứa các thông tin chi tiết như mã dự án, công ty phát hành, thời gian hết hạn và thời gian phát hành. Hãy 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 yêu cầu xác minh cho dự án của bạ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 của bạn.
  4. Hãy xác minh tổ chức phát hành, mã dự án và các thông tin khác có trong phần trọng tải mã thông báo để đảm bảo tính chính xác.

Thư viện ủy quyền của Google

Để xác minh thông báo từ Order with Google 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 tới 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 xuống và thêm một trong những thư viện này vào mã triển khai dịch vụ web của bạn.

Yêu cầu ví dụ xác minh

Các ví dụ sau đây minh họa cách triển khai phương thức 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");
}