Se uma assinatura de push usa autenticação, o serviço Pub/Sub assina um JSON Web Token (JWT) e o envia no cabeçalho de autorização da solicitação de push. O JWT inclui declarações e uma assinatura.
Os assinantes podem validar o JWT e verificar o seguinte:
- As declarações são precisas.
- O serviço do Pub/Sub assinou as declarações.
Se os assinantes usam um firewall, eles não podem receber solicitações push. Para receber
solicitações push, desative o firewall e verifique o JWT.
Se um assinante tiver um firewall, talvez você receba um erro 403 permission denied
.
Antes de começar
- Saiba mais sobre assinaturas.
- Entenda como funcionam as assinaturas push.
- Crie uma assinatura por push.
Formato JWT
O JWT é um JWT do OpenID Connect que consiste em um cabeçalho, um conjunto de declarações e uma assinatura. O serviço Pub/Sub codifica o JWT como uma string base64 com delimitadores de período.
Por exemplo, o cabeçalho de autorização a seguir inclui um JWT codificado:
"Authorization" : "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdkNjgwZDhjNzBkNDRlOTQ3MTMzY2JkNDk5ZWJjMWE2MWMzZDVh YmMiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJodHRwczovL2V4YW1wbGUuY29tIiwiYXpwIjoiMTEzNzc0M jY0NDYzMDM4MzIxOTY0IiwiZW1haWwiOiJnYWUtZ2NwQGFwcHNwb3QuZ3NlcnZpY2VhY2NvdW50LmNvb SIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJleHAiOjE1NTAxODU5MzUsImlhdCI6MTU1MDE4MjMzNSwia XNzIjoiaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTEzNzc0MjY0NDYzMDM4MzIxO TY0In0.QVjyqpmadTyDZmlX2u3jWd1kJ68YkdwsRZDo-QxSPbxjug4ucLBwAs2QePrcgZ6hhkvdc4UHY 4YF3fz9g7XHULNVIzX5xh02qXEH8dK6PgGndIWcZQzjSYfgO-q-R2oo2hNM5HBBsQN4ARtGK_acG-NGG WM3CQfahbEjZPAJe_B8M7HfIu_G5jOLZCw2EUcGo8BvEwGcLWB2WqEgRM0-xt5-UPzoa3-FpSPG7DHk7 z9zRUeq6eB__ldb-2o4RciJmjVwHgnYqn3VvlX9oVKEgXpNFhKuYA-mWh5o7BCwhujSMmFoBOh6mbIXF cyf5UiVqKjpqEbqPGo_AvKvIQ9VTQ"
O cabeçalho e o conjunto de declarações são strings JSON. Depois de decodificadas, elas assumem o seguinte formato:
{"alg":"RS256","kid":"7d680d8c70d44e947133cbd499ebc1a61c3d5abc","typ":"JWT"} { "aud":"https://example.com", "azp":"113774264463038321964", "email":"gae-gcp@appspot.gserviceaccount.com", "sub":"113774264463038321964", "email_verified":true, "exp":1550185935, "iat":1550182335, "iss":"https://accounts.google.com" }
Os tokens anexados às solicitações enviadas para os endpoints de push podem ter até uma hora.
Configurar o Pub/Sub para autenticação por push
O exemplo a seguir mostra como definir a conta de serviço de autenticação por push para
uma conta de serviço de sua escolha e como conceder o papel
iam.serviceAccountTokenCreator
ao
service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
agente de serviço.
Console
Acesse a página Assinaturas do Pub/Sub.
Clique em Criar assinatura.
No campo ID da assinatura, insira um nome.
Selecione um tópico.
Selecione Push como o Tipo de entrega.
Insira um URL de endpoint.
Marque Ativar autenticação.
Selecione uma conta de serviço
Verifique se o agente de serviço
service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
tem o papeliam.serviceAccountTokenCreator
no painel do IAM do projeto. Se a conta de serviço não tiver recebido o papel, clique em Conceder no painel do IAM para fazer isso.Opcional: insira um público-alvo.
Clique em Criar.
gcloud
# Configure the push subscription gcloud pubsub subscriptions (create|update|modify-push-config) ${SUBSCRIPTION} \ --topic=${TOPIC} \ --push-endpoint=${PUSH_ENDPOINT_URI} \ --push-auth-service-account=${SERVICE_ACCOUNT_EMAIL} \ --push-auth-token-audience=${OPTIONAL_AUDIENCE_OVERRIDE} # Your service agent # `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the # `iam.serviceAccountTokenCreator` role. PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\ --role='roles/iam.serviceAccountTokenCreator'
Ao ativar a autenticação para uma assinatura por push, talvez você encontre um erro permission denied
ou not authorized
.
Para resolver esse problema, conceda ao principal que inicia a criação ou atualização da assinatura a permissão iam.serviceAccounts.actAs
na conta de serviço. Para mais informações,
consulte Autenticação em
"Criar assinaturas push".
Se você usar uma assinatura push autenticada com um
aplicativo do App Engine protegido com o
Identity-Aware Proxy, forneça o
ID do cliente do IAP como público-alvo do token de autenticação push.
Para ativar o IAP no seu aplicativo do App Engine, consulte
Como ativar o IAP.
Para encontrar o ID do cliente do IAP, procure IAP-App-Engine-app
ID do cliente na página
Credenciais.
Reivindicações
O JWT pode ser usado para validar que as declarações, incluindo email
e aud
,
sejam assinadas pelo Google. Para mais informações sobre como as APIs do OAuth
2.0 do Google podem ser usadas para autenticação e autorização, consulte
OpenID Connect.
Dois mecanismos tornam essas declarações significativas. Primeiro, o Pub/Sub exige que o usuário ou a conta de serviço que faz a chamada
CreateSubscription, UpdateSubscription ou ModifyPushConfig tenha um papel
com a permissão iam.serviceAccounts.actAs
na conta de serviço de autenticação por push. Um exemplo desse tipo de função é
roles/iam.serviceAccountUser
(link em inglês).
Em segundo lugar, o acesso aos certificados utilizados para assinar os tokens é rigidamente
controlado. Para criar o token, o Pub/Sub precisa chamar um serviço
interno do Google usando uma identidade de conta de serviço de assinatura diferente, que é
o agente de serviço
service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
.
Essa conta de serviço de assinatura precisa ter a permissão iam.serviceAccounts.getOpenIdToken
ou o papel Criador de token da conta de serviço (roles/iam.serviceAccountTokenCreator
) na conta de serviço de autenticação por push (ou em qualquer recurso ancestral, como o projeto, da conta de serviço de autenticação por push).
Validar tokens
A validação de tokens enviados pelo Pub/Sub para o endpoint de push envolve:
- Verificar a integridade do token usando a validação de assinatura.
- Garantir que as reivindicações de e-mail e de público no token correspondam aos valores definidos na configuração da assinatura de push.
O exemplo a seguir mostra como autenticar uma solicitação por push em um aplicativo do App Engine não protegido com o Identity-Aware Proxy. Se o aplicativo do App Engine
estiver protegido com o IAP, o cabeçalho da solicitação HTTP que contém o
JWT do IAP será x-goog-iap-jwt-assertion
e precisará ser validado de acordo.
protocolo
Solicitação:
GET https://oauth2.googleapis.com/tokeninfo?id_token={BEARER_TOKEN}
Saída:
200 OK
{ "alg": "RS256", "aud": "example.com", "azp": "104176025330667568672", "email": "{SERVICE_ACCOUNT_NAME}@{YOUR_PROJECT_NAME}.iam.gserviceaccount.com", "email_verified": "true", "exp": "1555463097", "iat": "1555459497", "iss": "https://accounts.google.com", "kid": "3782d3f0bc89008d9d2c01730f765cfb19d3b70e", "sub": "104176025330667568672", "typ": "JWT" }
C#
Antes de tentar esse exemplo, siga as instruções de configuração do C# em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub C#.
Go
Java
Node.js
Python
Ruby
Para informações sobre a variável de ambiente PUBSUB_VERIFICATION_TOKEN
usada
nos exemplos de código acima,
consulte Como gravar e responder a mensagens do Pub/Sub.
Consulte o guia do Login do Google para sites e veja outros exemplos sobre como validar o JWT do portador. Para mais informações sobre os tokens do OpenID, acesse o guia do OpenID Connect, que inclui uma lista das bibliotecas de cliente que ajudam a validar os JWTs.
Autenticação de outros serviços Google Cloud
As funções do Cloud Run e do App Engine autenticam chamadas HTTP do Pub/Sub verificando tokens gerados pelo Pub/Sub. A única configuração necessária é conceder os papéis do IAM necessários à conta do autor da chamada.
Consulte os guias e tutoriais a seguir para diferentes casos de uso com esses serviços:
Cloud Run
- Acionamento por push do Pub/Sub:
sua conta de serviço de autenticação por push precisa ter a função
roles/run.invoker
e estar vinculada a um serviço do Cloud Run para invocar um serviço correspondente do Cloud Run. - Tutorial Como usar o Pub/Sub com o Cloud Run
App Engine
Funções do Cloud Run
- Gatilhos HTTP:
sua conta de serviço de autenticação push precisa ter a função
roles/cloudfunctions.invoker
para invocar uma função se você pretende usar solicitações push do Pub/Sub como gatilhos HTTP para a função. - Acionadores do Google Cloud Pub/Sub: os papéis e as permissões do IAM são configurados automaticamente se você usar acionadores do Pub/Sub para invocar uma função.