الترخيص والتحقق

نفِّذ عملية التحقّق من رسائل الطلبات لضمان أنّ طلبات الدفع وإرسال الطلبات إلى نقطة نهاية تنفيذ تأتي من Google، ومنع الجهات الخارجية غير المصرَّح بها من الاتصال بنقطة نهاية.

إثبات ملكية الرسالة باستخدام JWT

إنّ الطلبات المرسَلة إلى نقطة نهاية التسليم والتي تأتي من خوادم Ordering End-to-End تحتوي على رمز موقَّع JSON Web Token (JWT) في عنوان Authorization لأغراض الأمان. يتم إنشاء الرمز المميّز بواسطة خدمة مصادقة مشترَكة يمكن أن تطلبها كلّ من Google ونقطة نهاية تنفيذ عملية التسليم.

  1. تُنشئ Google ملف JWT موقَّعًا باستخدام خدمة التفويض ورقم تعريف مشروع طلب الطعام.
  2. تُرسِل Google الرمز المميّز الموقَّع في عنوان Authorization لكل طلب إلى نقطة نهاية التسليم.
  3. يجب أن تفكِّ نقطة النهاية ترميز الرمز المميّز الموقَّع باستخدام مكتبة Google Auth Library. يحتوي الرمز المميّز الذي تم فك تشفيره على تفاصيل مثل معرّف المشروع والمُصدِر ووقت انتهاء الصلاحية ووقت الإصدار. استخدِم هذه البيانات لتحديد مدى صحة الطلب.

لتنفيذ طلب إثبات ملكية مشروعك، اتّبِع الخطوات التالية:

  1. استخرِج JWT من عنوان Authorization للطلبات الواردة.
  2. فك ترميز الرمز المميّز باستخدام مكتبة Google Auth.
  3. اضبط audience للرمز المميّز على رقم تعريف مشروعك.
  4. تأكَّد من صحة معلومات جهة الإصدار ومعرّف المشروع والمعلومات الأخرى المضمّنة في الحمولة الرمزية لضمان دقتها.

Google Authorization Library

للتحقّق من الرسائل الواردة من ميزة "الطلب من البداية إلى النهاية" وإنشاء رموز التفويض للرسائل التي ترسلها خدمة الويب إلى 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");
}