ระบบจะตั้งค่า 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 API แบบโอเพนซอร์สเพื่อยืนยันโทเค็นของ Bearer ดังนี้
- Java: https://github.com/google/google-api-java-client
- Python: https://github.com/google/google-api-python-client
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')