הרשאה ואימות

כדאי לאמת את הודעות הבקשה כדי לוודא ש-Checkout ושליחה של בקשות להזמנות לנקודת הקצה של מילוי ההזמנה מ-Google, ולמנוע מצדדים שלישיים לא מורשים להתקשר לנקודת הקצה שלך.

אימות הודעה באמצעות JWT

מטעמי אבטחה, בקשות לנקודת הקצה של מילוי הבקשה שמגיעות משרתים מקצה לקצה של הזמנה כוללות אסימון JSON Web Token (JWT) חתום בכותרת Authorization. האסימון נוצר על ידי שירות הרשאות משותף שגם Google וגם ההטמעה של נקודת הקצה של מילוי הבקשה יכולה לקרוא לו.

  1. Google יוצרת JWT חתום באמצעות שירות ההרשאה ומזהה הפרויקט של הפרויקט להזמנת אוכל.
  2. Google שולחת את האסימון החתום בכותרת Authorization של כל בקשה לנקודת הקצה של מילוי הבקשה.
  3. נקודת הקצה (endpoint) שלכם צריכה לפענח את האסימון החתום באמצעות Google Auth Library. האסימון המפוענח מכיל פרטים כמו מזהה הפרויקט, המנפיק, מועד התפוגה ושעת ההנפקה. הנתונים האלה מאפשרים לקבוע את אותנטיות הבקשה.

כדי להטמיע אימות של בקשה בפרויקט, יש לפעול לפי השלבים הבאים:

  1. מחלצים את ה-JWT מהכותרת Authorization של בקשות נכנסות.
  2. פענוח האסימון באמצעות Google Auth Library.
  3. מגדירים את audience של האסימון כמזהה הפרויקט.
  4. כדי לשמור על דיוק, צריך לאמת את המנפיק, מזהה הפרויקט ומידע נוסף שנכלל במטען הייעודי (payload) של האסימון.

ספריית ההרשאות של 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");
}