הרשאה ואימות

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

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

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

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

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

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

ספריית ההרשאות של Google

כדי לאמת הודעות מ-Order with 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");
}