Авторизация и проверка

Внедрите проверку сообщений запросов, чтобы гарантировать, что запросы на оформление заказа и отправку заказов на вашу конечную точку выполнения поступают от Google, и не допустить несанкционированных звонков третьих лиц на вашу конечную точку.

Проверка сообщения с использованием JWT

Запросы к вашей конечной точке выполнения, поступающие от сквозных серверов заказа, содержат подписанный веб-токен JSON (JWT) в заголовке Authorization для обеспечения безопасности. Токен генерируется общей службой авторизации, которую может вызывать как Google, так и ваша реализация конечной точки выполнения.

  1. Google создает подписанный JWT, используя службу авторизации и идентификатор вашего проекта заказа еды.
  2. Google отправляет подписанный токен в заголовке Authorization каждого запроса в вашу конечную точку выполнения.
  3. Ваша конечная точка должна декодировать подписанный токен с помощью библиотеки Google Auth. Декодированный токен содержит такие данные, как идентификатор проекта, эмитент, срок действия и время выдачи. Используйте эти данные для определения подлинности запроса.

Чтобы реализовать проверку запросов для вашего проекта, выполните следующие действия:

  1. Извлеките JWT из заголовка Authorization входящих запросов.
  2. Расшифруйте токен с помощью библиотеки Google Auth .
  3. Установите для audience токена идентификатор вашего проекта.
  4. Проверьте эмитента, идентификатор проекта и другую информацию, содержащуюся в полезных данных токена, на предмет точности.

Библиотека авторизации Google

Чтобы проверять сообщения от Ordering End-to-End и генерировать коды авторизации для сообщений, которые ваш веб-сервис отправляет в Google, используйте библиотеку Google Auth на выбранном вами языке программирования:

Загрузите и добавьте одну из этих библиотек в код реализации вашего веб-сервиса.

Запросить примеры проверки

Следующие примеры демонстрируют, как реализовать проверку запроса:

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");
}