Her uygulama içi işlem HTTP isteğinin Authorization
başlığında bir Bearer Token
ayarlanır. Örneğin:
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
Yukarıdaki örnekte "AbCdEf123456" dizesi, hamiline ait yetkilendirme jetonudur.
Bu, Google tarafından üretilen bir kriptografik jetondur.
İşlemlerle birlikte gönderilen tüm kimlik bilgisi jetonlarında azp
(yetkili taraf) alanı gmail@system.gserviceaccount.com
olarak bulunur. audience
alanında ise gönderen alanı, formun URL'si olarak https://
belirtilir. Örneğin, e-posta noreply@example.com
adresinden gönderilmişse kitle https://example.com
olur.
Taşıyıcı jetonları kullanıyorsanız isteğin Google'dan geldiğini ve gönderen alanına yönelik olduğunu doğrulayın. Jeton doğrulanamazsa hizmet, isteğe 401 (Unauthorized)
HTTP yanıt koduyla yanıt vermelidir.
Hamiline ait jetonlar, OAuth V2 standardının bir parçasıdır ve Google API'leri tarafından yaygın olarak kullanılır.
Hamiline ait jetonları doğrulama
Hizmetlerin, Taşıyıcı jetonlarını doğrulamak için açık kaynak Google API istemci kitaplığını kullanması önerilir:
- 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')