Otorisasi dan verifikasi

Terapkan verifikasi pesan permintaan untuk memastikan bahwa permintaan Checkout dan Kirim Pesanan ke endpoint fulfillment Anda berasal dari Google dan mencegah pihak ketiga yang tidak sah memanggil endpoint Anda.

Verifikasi pesan menggunakan JWT

Permintaan ke endpoint fulfillment Anda yang berasal dari server Ordering End-to-End berisi JSON Web Token (JWT) yang ditandatangani di header Authorization untuk keamanan. Token dibuat oleh layanan otorisasi bersama yang dapat dipanggil oleh Google dan penerapan endpoint fulfillment Anda.

  1. Google membuat JWT yang ditandatangani menggunakan layanan otorisasi dan project ID project Pesanan Makanan Anda.
  2. Google mengirimkan token yang ditandatangani di header Authorization setiap permintaan ke endpoint fulfillment Anda.
  3. Endpoint Anda harus mendekode token yang ditandatangani menggunakan Library Autentikasi Google. Token yang didekode berisi detail seperti project ID, penerbit, waktu habis masa berlaku, dan waktu diterbitkan. Gunakan data ini untuk menentukan keaslian permintaan.

Untuk menerapkan verifikasi permintaan untuk project Anda, ikuti langkah-langkah berikut:

  1. Ekstrak JWT dari header Authorization permintaan masuk.
  2. Dekode token menggunakan Library Google Auth.
  3. Tetapkan audience token ke project ID Anda.
  4. Verifikasi penerbit, project ID, dan informasi lainnya yang terdapat dalam payload token untuk akurasi.

Library Otorisasi Google

Untuk memverifikasi pesan dari Pemesanan End-to-End dan membuat kode otorisasi untuk pesan yang dikirim layanan web Anda ke Google, gunakan Library Google Auth dalam bahasa pemrograman pilihan Anda:

Download dan tambahkan salah satu library ini ke kode implementasi layanan web Anda.

Contoh permintaan verifikasi

Contoh berikut menunjukkan cara menerapkan verifikasi permintaan:

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