הרשאה ואימות

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

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

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

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

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

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

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

כדי לאמת הודעות מ-Ordering End-to-End וליצור קודי הרשאה להודעות ששירות האינטרנט שלכם שולח ל-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");
}