التفويض وإثبات الملكية

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

التحقق من الرسائل باستخدام JWT

تتضمّن الطلبات الواردة إلى نقطة نهاية توصيل الطلبات الواردة من خوادم"الطلب من خلال Google"رمز JSON المميّز للويب (JWT) في عنوان Authorization للأمان. يتم إنشاء الرمز المميز من خلال خدمة تفويض مشتركة يمكن طلبها من خلال كل من Google وتنفيذ نقطة نهاية التنفيذ.

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

لتنفيذ طلب التحقق لمشروعك، اتبع الخطوات التالية:

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

مكتبة تفويض Google

للتحقّق من الرسائل الواردة من خدمة "الطلب من خلال Google" وإنشاء رموز تفويض للرسائل التي ترسلها خدمة الويب إلى Google، استخدِم "مكتبة المصادقة من Google" بلغة البرمجة التي تختارها:

يُرجى تنزيل إحدى هذه المكتبات وإضافتها إلى رمز تنفيذ خدمة الويب.

أمثلة على طلب إثبات الملكية

توضّح الأمثلة التالية كيفية إثبات صحة الطلب:

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