Uỷ 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 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 đều do Google cung cấp, đồng thời 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 tin nhắn bằng JWT

Để đảm bảo tính bảo mật, các yêu cầu gửi tới điểm cuối thực hiện của bạn qua các máy chủ đầu cuối đặt hàng sẽ chứa một Mã thông báo web JSON (JWT) đã ký trong tiêu đề Authorization. Mã thông báo này do một dịch vụ uỷ quyền dùng chung tạo ra, mà cả Google và phương thức triển khai điểm cuối phương thức thực hiện của bạn đều có thể gọi.

  1. Google tạo một JWT đã ký bằng dịch vụ uỷ 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 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, nhà 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 quy trình 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 của bạn.
  4. Xác minh nhà phát hành, mã dự án và các thông tin khác có trong tải trọng của 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 thông báo từ Sắp xếp hai đầu và để tạo mã uỷ quyền cho 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 các thư viện này vào mã triển khai dịch vụ web của bạn.

Ví dụ về yêu cầu xác minh

Các ví dụ sau đây minh hoạ cách triển khai tính năng 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");
}