Un Bearer Token
est défini dans l'en-tête Authorization
de chaque requête HTTP d'action dans l'application. Exemple :
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
Dans l'exemple ci-dessus, la chaîne "AbCdEf123456" est le jeton d'autorisation du porteur.
Il s'agit d'un jeton cryptographique produit par Google.
Tous les jetons de support envoyés avec des actions ont le champ azp
(partie autorisée) défini sur [email protected]
, avec le champ audience
spécifiant le domaine de l'expéditeur sous la forme d'une URL https://
. Par exemple, si l'adresse e-mail est [email protected]
, l'audience est https://example.com
.
Si vous utilisez des jetons du porteur, vérifiez que la requête provient de Google et qu'elle est destinée au domaine de l'expéditeur. Si le jeton n'est pas validé, le service doit répondre à la requête avec un code de réponse HTTP 401 (Unauthorized)
.
Les jetons de support font partie de la norme OAuth V2 et sont largement adoptés par les API Google.
Vérifier les jetons de support
Nous encourageons les services à utiliser la bibliothèque cliente Google API Open Source pour valider les jetons Bearer :
- Java : https://github.com/google/google-api-java-client
- Python : https://github.com/google/google-api-python-client
.NET : https://github.com/google/google-api-dotnet-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 = "[email protected]";
// 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 = '[email protected]'
# 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')