يتم ضبط 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 الإصدار الثاني وتستخدمها Google APIs على نطاق واسع.
التحقّق من صحة الرموز المميّزة لحاملها
ننصح الخدمات باستخدام مكتبة عميل Google API مفتوحة المصدر للتحقّق من صحة الرموز المميّزة لحاملها:
- جافا: https://github.com/google/google-api-java-client
- Python: https://github.com/google/google-api-python-client
جافا
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')