التحقق من الرموز المميزة للحامل

يتم ضبط 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).

تشكّل الرموز المميّزة لحاملها جزءًا من معيار OAuth V2، وهي معتمدة على نطاق واسع من قِبل Google APIs.

التحقق من الرموز المميزة للحامل

ننصح الخدمات باستخدام مكتبة "عميل واجهة برمجة تطبيقات Google" المفتوحة المصدر للتحقّق من رموز 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')