Taşıma son noktanıza gelen Ödeme ve Sipariş Gönderme isteklerinin Google'dan geldiğinden emin olmak ve yetkisiz üçüncü tarafların uç noktanızı çağırmasını önlemek için istek mesajı doğrulamasını uygulayın.
JWT kullanarak mesaj doğrulama
Sipariş uçtan uca sunucularından gelen ve sipariş tamamlama uç noktanıza gönderilen istekler, güvenlik için Authorization
başlığında imzalanmış bir JSON Web Jetonu (JWT) içerir. Jeton, hem Google hem de sipariş tamamlama uç noktası uygulamanız tarafından çağrılabilecek ortak bir yetkilendirme hizmeti tarafından oluşturulur.
- Google, yetkilendirme hizmetini ve Yemek Siparişi projenizin proje kimliğini kullanarak imzalı bir JWT oluşturur.
- Google, imzalanan jetonu her isteğin
Authorization
başlığında yerine getirme uç noktanıza gönderir. - Uç noktanız, Google Kimlik Doğrulama Kitaplığı'nı kullanarak imzalanmış jetonun kodunu çözmelidir. Kodu çözülmüş jeton, proje kimliği, ihraç eden, geçerlilik bitiş tarihi ve düzenlenme zamanı gibi ayrıntıları içerir. İsteğin gerçekliğini belirlemek için bu verileri kullanın.
Projeniz için istek doğrulamasını uygulamak üzere aşağıdaki adımları uygulayın:
- Gelen isteklerin
Authorization
üstbilgisinin JWT'sini çıkarın. - Google Kimlik Doğrulama Kitaplığı'nı kullanarak jetonun kodunu çözün.
- Jetonun
audience
değerini proje kimliğinize ayarlayın. - Doğruluğu kontrol etmek için jeton yükünde bulunan ihraççıyı, proje kimliğini ve diğer bilgileri doğrulayın.
Google Yetkilendirme Kitaplığı
Sipariş Uçtan Uca'dan gelen mesajları doğrulamak ve web hizmetinizin Google'a gönderdiği mesajlar için yetkilendirme kodları oluşturmak amacıyla, tercih ettiğiniz programlama dilinde Google Kimlik Doğrulama Kitaplığı'nı kullanın:
- Node.js için Google kimlik doğrulama kitaplığı
- Python için Google kimlik doğrulama kitaplığı
- Java için Google kimlik doğrulama kitaplığı
Bu kitaplıklardan birini indirip web hizmeti uygulama kodunuza ekleyin.
Doğrulama isteği örnekleri
Aşağıdaki örneklerde istek doğrulamasının nasıl uygulanacağı gösterilmektedir:
Node.js
const auth = require('google-auth-library') const authClient = new auth.OAuth2Client() /** * Verifies that an incoming request came from Google. * @param {String} idToken - The ID token used to verify the request * (i.e. The value found in the Authorization header of an incoming request). * @param {String} audience - The expected audience of the request * (i.e. The project ID for your project). * @return {boolean} True if request came from Google, false otherwise. */ function isRequestFromGoogle(idToken, audience) { authClient.verifyIdToken({idToken, audience}, (err, info) => { return !(err || info['iss'] !== 'https://accounts.google.com') }) }
Python
from google.oauth2 import id_token from google.auth.transport import requests def isRequestFromGoogle(audience, token): """ Verifies that an incoming request came from Google. Args: audience (str): The expected audience of the request (i.e. The project ID for your project) token (str): The ID token used to verify the request (i.e. The value found in the Authorization header of an incoming request) Returns: True if the request came from Google, False otherwise. """ id_info = id_token.verify_oauth2_token(token, requests.Request(), audience) return id_info['iss'] == 'https://accounts.google.com'
Java
/** * Verifies that an incoming request came from Google. * @param audience The expected audience of the request * (i.e. The project ID for your project) * @param token The ID token used to verify the request * (i.e. The value found in the Authorization * header of an incoming request) * @return {@code true} if request is from Google, else {@code false} */ public boolean isRequestFromGoogle(String audience, String token) { GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier .Builder(transport, jsonFactory) .setAudience(Collections.singletonList(audience)) .build(); GoogleIdToken idToken = verifier.verify(token); if (idToken == null) return false; Payload payload = idToken.getPayload(); String issuer = (String) payload.get("iss"); return issuer.equals("https://accounts.google.com"); }