Implemente a verificação de mensagens de solicitação para garantir que as solicitações de finalização de compra e envio de pedidos para seu endpoint de fulfillment sejam do Google e impedir que terceiros não autorizados chamem seu endpoint.
Verificação de mensagens usando JWT
As solicitações para o endpoint de fulfillment que vêm de servidores de pedidos de ponta a ponta contêm um token da Web JSON (JWT) assinado no cabeçalho Authorization
para fins de segurança. O token é gerado
por um serviço de autorização compartilhado que pode ser chamado pelo Google e pela implementação do endpoint de
atendimento.
- O Google gera um JWT assinado usando o serviço de autorização e o ID do projeto do seu projeto de pedidos de comida.
- O Google envia o token assinado no cabeçalho
Authorization
de cada solicitação para o endpoint de fulfillment. - Seu endpoint precisa decodificar o token assinado usando a Biblioteca de autenticação do Google. O token decodificado contém detalhes como o ID do projeto, o emissor, o prazo de validade e o horário de emissão. Use esses dados para determinar a autenticidade da solicitação.
Para implementar a verificação de solicitação no seu projeto, siga estas etapas:
- Extraia o JWT do cabeçalho
Authorization
das solicitações recebidas. - Decodificar o token usando a Biblioteca do Google Auth.
- Defina o
audience
do token como o ID do projeto. - Verifique a precisão do emissor, do ID do projeto e de outras informações contidas no payload do token.
Biblioteca de autorização do Google
Para verificar mensagens do pedido de ponta a ponta e gerar códigos de autorização para mensagens que seu serviço da Web envia ao Google, use a biblioteca de autenticação do Google na linguagem de programação de sua escolha:
- Biblioteca de autenticação do Google para Node.js
- Biblioteca de autenticação do Google para Python
- Biblioteca de autenticação do Google para Java
Faça o download e adicione uma dessas bibliotecas ao código de implementação do serviço da Web.
Exemplos de solicitação de verificação
Os exemplos a seguir demonstram como implementar a verificação de solicitação:
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"); }