Im Authorization
-Header jeder HTTP-Anfrage für In-App-Aktionen wird ein Bearer Token
festgelegt. Beispiel:
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
Der String „AbCdEf123456“ im obigen Beispiel ist das Inhaberautorisierungstoken.
Dies ist ein von Google erstelltes kryptografisches Token.
Alle Inhabertokens, die mit Aktionen gesendet werden, haben im Feld azp
(autorisierte Partei) den folgenden Wert:
gmail@system.gserviceaccount.com
, wobei im Feld audience
die Absenderdomain als URL des Formulars angegeben wird
https://
. Stammt die E-Mail beispielsweise von noreply@example.com
,
Zielgruppe ist https://example.com
.
Wenn Sie Inhabertokens verwenden, prüfen Sie, ob die Anfrage von Google stammt
und für die Absenderdomain vorgesehen. Wenn das Token nicht bestätigt wird, sollte der Dienst
auf die Anfrage mit dem HTTP-Antwortcode 401 (Unauthorized)
antworten.
Inhabertokens sind Teil des OAuth V2-Standards und werden von den Google APIs weit verbreitet.
Inhabertokens verifizieren
Den Diensten wird empfohlen, die Open-Source-Clientbibliothek der Google API zur Überprüfung von Inhabertokens zu verwenden:
- 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')