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

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

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

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

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

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

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

Google Authorization Library

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

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

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

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

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