אימות אסימון אסימון

השדה Bearer Token מוגדר בכותרת Authorization של כל בקשת HTTP של פעולה בתוך האפליקציה. לדוגמה:

POST /approve?expenseId=abc123 HTTP/1.1
Host: your-domain.com
Authorization: Bearer AbCdEf123456
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/1.0 (KHTML, like Gecko; Gmail Actions)

confirmed=Approved

המחרוזת "AbCdEf123456" בדוגמה למעלה היא אסימון ההרשאה למוכ"ז. זהו אסימון קריפטוגרפי שנוצר על ידי Google. בכל האסימונים למוכ"ז שנשלחים עם הפעולות מופיע השדה azp (צד מורשה) gmail@system.gserviceaccount.com, כאשר השדה audience מציין את דומיין השולח בתור כתובת URL של הטופס https://. לדוגמה, אם האימייל הוא מ-noreply@example.com, הקהל הוא https://example.com.

אם אתם משתמשים באסימונים למוכ"ז, חשוב לוודא שהבקשה מגיעה מ-Google ושהיא מיועדת לדומיין של השולח. אם האסימון לא אומת, השירות אמור להגיב לבקשה באמצעות קוד תגובת HTTP 401 (Unauthorized).

אסימוני Bearer Tokens הם חלק מתקן OAuth V2, והם מאומצים באופן נרחב על ידי Google APIs.

אימות אסימונים למוכ"ז

מומלץ לשירותים להשתמש בספריית הלקוח של Google API בקוד פתוח כדי לאמת אסימונים של Bearer:

Java

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.http.apache.ApacheHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;

public class TokenVerifier {
    // Bearer Tokens from Gmail Actions will always be issued to this authorized party.
    private static final String GMAIL_AUTHORIZED_PARTY = "gmail@system.gserviceaccount.com";

    // Intended audience of the token, based on the sender's domain
    private static final String AUDIENCE = "https://example.com";

    public static void main(String[] args) throws GeneralSecurityException, IOException {
        // Get this value from the request's Authorization HTTP header.
        // For example, for "Authorization: Bearer AbCdEf123456" use "AbCdEf123456"
        String bearerToken = "AbCdEf123456";

        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(new ApacheHttpTransport(), new JacksonFactory())
                .setAudience(Collections.singletonList(AUDIENCE))
                .build();

        GoogleIdToken idToken = verifier.verify(bearerToken);
        if (idToken == null || !idToken.getPayload().getAuthorizedParty().equals(GMAIL_AUTHORIZED_PARTY)) {
            System.out.println("Invalid token");
            System.exit(-1);
        }

        // Token originates from Google and is targeted to a specific client.
        System.out.println("The token is valid");

        System.out.println("Token details:");
        System.out.println(idToken.getPayload().toPrettyString());
    }
}

Python

import sys

from oauth2client import client

# Bearer Tokens from Gmail Actions will always be issued to this authorized party.
GMAIL_AUTHORIZED_PARTY = 'gmail@system.gserviceaccount.com'

# Intended audience of the token, based on the sender's domain
AUDIENCE = 'https://example.com'

try:
  # Get this value from the request's Authorization HTTP header.
  # For example, for "Authorization: Bearer AbCdEf123456" use "AbCdEf123456"
  bearer_token = 'AbCdEf123456'

  # Verify valid token, signed by google.com, intended for a third party.
  token = client.verify_id_token(bearer_token, AUDIENCE)
  print('Token details: %s' % token)

  if token['azp'] != GMAIL_AUTHORIZED_PARTY:
    sys.exit('Invalid authorized party')
except:
  sys.exit('Invalid token')

# Token originates from Google and is targeted to a specific client.
print('The token is valid')