การให้สิทธิ์และการยืนยัน

ใช้การยืนยันข้อความคําขอเพื่อให้คําขอชําระเงินและส่งคําขอไปยังปลายทางการดําเนินการตามคําสั่งซื้อมาจาก Google และป้องกันไม่ให้บุคคลที่สามที่ไม่ได้รับอนุญาตเรียกใช้ปลายทางของคุณ

การยืนยันข้อความโดยใช้ JWT

คําขอที่ส่งไปยังปลายทางการดําเนินการคําสั่งซื้อที่มาจากเซิร์ฟเวอร์ Order with Google มีโทเค็นเว็บ JSON (JWT) ที่ลงนามแล้วในส่วนหัว Authorization เพื่อความปลอดภัย โทเค็นนี้สร้างขึ้นจากบริการการให้สิทธิ์ที่แชร์ ซึ่งทั้ง Google และการใช้งานปลายทางการดําเนินการตามคําสั่งซื้อของคุณเรียกได้

  1. Google จะสร้าง JWT ที่มีการรับรองโดยใช้บริการการให้สิทธิ์และรหัสของโปรเจ็กต์การสั่งอาหาร
  2. Google จะส่งโทเค็น Signed ในส่วนหัวของ Authorization ของคําขอทุกรายการไปยังปลายทางการดําเนินการตามคําสั่งซื้อ
  3. ปลายทางต้องถอดรหัสโทเค็นที่ลงนามโดยใช้ Google Auth Library โทเค็นที่ถอดรหัสแล้วจะมีรายละเอียดต่างๆ เช่น รหัสโปรเจ็กต์ ผู้ออกบัตร เวลาหมดอายุ และเวลาที่ออก ใช้ข้อมูลนี้เพื่อกําหนดความถูกต้องของคําขอ

หากต้องการใช้การยืนยันคําขอสําหรับโปรเจ็กต์ ให้ทําตามขั้นตอนต่อไปนี้

  1. แยก JWT จากส่วนหัว Authorization ของคําขอที่เข้ามาใหม่
  2. ถอดรหัสโทเค็นโดยใช้ไลบรารีการตรวจสอบสิทธิ์ของ Google
  3. ตั้งค่า audience ของโทเค็นเป็นรหัสโปรเจ็กต์
  4. ตรวจสอบผู้ออกใบรับรอง รหัสโปรเจ็กต์ และข้อมูลอื่นๆ ที่มีในเพย์โหลดโทเค็นเพื่อความถูกต้อง

ไลบรารีการให้สิทธิ์ของ Google

หากต้องการยืนยันข้อความจาก Order with Google และสร้างรหัสการให้สิทธิ์สําหรับข้อความที่บริการเว็บส่งมายัง Google ให้ใช้ Google Auth Library ในภาษาโปรแกรมที่คุณต้องการ ดังนี้

ดาวน์โหลดและเพิ่มไลบรารีใดโค้ดหนึ่งต่อไปนี้ลงในโค้ดการใช้งานบริการเว็บ

ตัวอย่างการยืนยันคําขอ

ตัวอย่างต่อไปนี้แสดงวิธียืนยันคําขอ

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