Внедрите проверку сообщений запросов, чтобы гарантировать, что запросы на оформление заказа и отправку заказов на вашу конечную точку выполнения поступают от Google, и не допустить несанкционированных звонков третьих лиц на вашу конечную точку.
Проверка сообщения с использованием JWT
Запросы к вашей конечной точке выполнения, поступающие от сквозных серверов заказа, содержат подписанный веб-токен JSON (JWT) в заголовке Authorization
для обеспечения безопасности. Токен генерируется общей службой авторизации, которую может вызывать как Google, так и ваша реализация конечной точки выполнения.
- Google генерирует подписанный JWT, используя службу авторизации и идентификатор вашего проекта заказа еды.
- Google отправляет подписанный токен в заголовке
Authorization
каждого запроса в вашу конечную точку выполнения. - Ваша конечная точка должна декодировать подписанный токен с помощью библиотеки Google Auth. Декодированный токен содержит такие данные, как идентификатор проекта, эмитент, срок действия и время выдачи. Используйте эти данные для определения подлинности запроса.
Чтобы реализовать проверку запросов для вашего проекта, выполните следующие действия:
- Извлеките JWT из заголовка
Authorization
входящих запросов. - Расшифруйте токен с помощью библиотеки Google Auth .
- Установите
audience
токена идентификатор вашего проекта. - Проверьте эмитента, идентификатор проекта и другую информацию, содержащуюся в полезных данных токена, на предмет точности.
Библиотека авторизации Google
Чтобы проверять сообщения от Ordering End-to-End и генерировать коды авторизации для сообщений, которые ваш веб-сервис отправляет в Google, используйте библиотеку Google Auth на выбранном вами языке программирования:
- Библиотека аутентификации Google для Node.js
- Библиотека аутентификации Google для Python
- Библиотека аутентификации Google для Java
Загрузите и добавьте одну из этих библиотек в код реализации вашего веб-сервиса.
Запросить примеры проверки
Следующие примеры демонстрируют, как реализовать проверку запроса:
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') }) }
Питон
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'
Ява
/** * 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"); }