Se uma assinatura por push usa a 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, você poderá receber um erro 403 permission denied.
Antes de começar
- Saiba mais sobre assinaturas.
- Entenda como as assinaturas de push funcionam.
- Crie uma assinatura por push.
Formato JWT
O JWT é um JWT do OpenIDConnect que consiste em um cabeçalho, conjunto de declarações e 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 de push para
uma conta de serviço de sua escolha e como conceder o
iam.serviceAccountTokenCreator papel 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.comtem o papeliam.serviceAccountTokenCreatorno painel do IAM do seu 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, você pode encontrar um erro permission denied ou not authorized.
Para resolver esse problema, conceda à 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 de push."
Se você usar uma assinatura por 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 de push.
Para ativar o IAP no aplicativo do App Engine, consulte
Como ativar o IAP.
Para encontrar o ID do cliente do IAP, procure o 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 de push. Um exemplo desse papel é o
roles/iam.serviceAccountUser
papel.
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 separada, 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 um papel Criador de token da conta de serviço (roles/iam.serviceAccountTokenCreator) na conta de serviço de autenticação de push (ou em qualquer recurso ancestral, como o projeto, da conta de serviço de autenticação de 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 declarações de e-mail e de público no token correspondam aos valores definidos na configuração da assinatura por push.
O exemplo a seguir mostra como autenticar uma solicitação de 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 neste guia. 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 Google Cloud serviços
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:
a conta de serviço de autenticação de push precisa ter o
roles/run.invokerpapel 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
Cloud Run functions
- Acionadores HTTP:
a conta de serviço de autenticação de push precisa ter o
roles/cloudfunctions.invokerpapel para invocar uma função se você pretende usar solicitações de push do Pub/Sub como acionadores HTTP para a função. - Acionadores do Google Cloud Pub/Sub: os papéis e permissões do IAM são configurados automaticamente se você usar acionadores do Pub/Sub para invocar uma função.