Si una suscripción push usa autenticación, el servicio Pub/Sub firma un JSON Web Token (JWT) y lo envía en el encabezado de autorización de la solicitud push. El JWT incluye reclamaciones y una firma.
Los suscriptores pueden validar el JWT y verificar lo siguiente:
- Las afirmaciones son precisas.
- El servicio Pub/Sub ha firmado las reclamaciones.
Si los suscriptores usan un cortafuegos, no podrán recibir solicitudes push. Para recibir solicitudes push, debes desactivar el cortafuegos y verificar el JWT.
Si un suscriptor tiene un cortafuegos, es posible que recibas un 403 permission denied
error.
Antes de empezar
- Consulta información sobre las suscripciones.
- Consulta cómo funcionan las suscripciones push.
- Crea una suscripción de inserción.
Formato JWT
El JWT es un JWT de OpenID Connect que consta de un encabezado, un conjunto de reclamaciones y una firma. El servicio Pub/Sub codifica el JWT como una cadena base64 con delimitadores de puntos.
Por ejemplo, el siguiente encabezado de autorización incluye un 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"
El encabezado y el conjunto de reclamaciones son cadenas JSON. Una vez decodificados, tienen el siguiente 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" }
Las tokens adjuntas a las solicitudes enviadas a los endpoints de inserción pueden tener hasta una hora de antigüedad.
Configurar Pub/Sub para la autenticación push
En el siguiente ejemplo se muestra cómo configurar la cuenta de servicio de autenticación push en una cuenta de servicio de tu elección y cómo asignar el rol iam.serviceAccountTokenCreator
al service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
agente de servicio.
Consola
Ve a la página Suscripciones de Pub/Sub.
Haz clic en Crear suscripción.
En el campo ID de suscripción, introduce un nombre.
Selecciona un tema.
Seleccione Push como Tipo de envío.
Introduce una URL de endpoint.
Marca Habilitar autenticación.
Selecciona una cuenta de servicio.
Asegúrate de que el agente de servicio
service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
tenga el roliam.serviceAccountTokenCreator
en el panel de gestión de identidades y accesos de tu proyecto. Si no se ha concedido el rol a la cuenta de servicio, haz clic en Conceder en el panel de control de gestión de identidades y accesos para hacerlo.Opcional: Introduce una audiencia.
Haz clic en Crear.
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'
Cuando habilitas la autenticación para una suscripción push, es posible que se produzca un error permission denied
o not authorized
.
Para solucionar este problema, otorga al principal que inicia la creación o la actualización de la suscripción el permiso iam.serviceAccounts.actAs
en la cuenta de servicio. Para obtener más información, consulta la sección Autenticación del artículo "Crear suscripciones de inserción".
Si usas una suscripción push autenticada con una aplicación de App Engine protegida con Identity-Aware Proxy, debes proporcionar el ID de cliente de IAP como audiencia de tu token de autenticación push.
Para habilitar IAP en tu aplicación App Engine, consulta Habilitar IAP.
Para encontrar el ID de cliente de IAP, busca IAP-App-Engine-app
Client ID en la página Credenciales.
Reclamaciones
El JWT se puede usar para validar que las reclamaciones, incluidas las reclamaciones email
y aud
, están firmadas por Google. Para obtener más información sobre cómo se pueden usar las APIs OAuth 2.0 de Google para la autenticación y la autorización, consulta OpenID Connect.
Hay dos mecanismos que hacen que estas reclamaciones sean significativas. En primer lugar, Pub/Sub requiere que el usuario o la cuenta de servicio que realice la llamada CreateSubscription, UpdateSubscription o ModifyPushConfig tenga un rol con el permiso iam.serviceAccounts.actAs
en la cuenta de servicio de autenticación push. Un ejemplo de este tipo de rol es el rol
roles/iam.serviceAccountUser
.
En segundo lugar, el acceso a los certificados utilizados para firmar los tokens está estrictamente controlado. Para crear el token, Pub/Sub debe llamar a un servicio interno de Google mediante una identidad de cuenta de servicio de firma independiente, que es el agente de servicio service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
.
Esta cuenta de servicio de firma debe tener el permiso iam.serviceAccounts.getOpenIdToken
o el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator
) en la cuenta de servicio de autenticación push (o en cualquier recurso antecesor, como el proyecto, de la cuenta de servicio de autenticación push).
Validar tokens
Para validar los tokens que envía Pub/Sub al endpoint de envío, debes hacer lo siguiente:
- Comprobar la integridad del token mediante la validación de la firma.
- Asegurarse de que las reclamaciones email y audience del token coincidan con los valores definidos en la configuración de la suscripción push.
En el siguiente ejemplo se muestra cómo autenticar una solicitud push en una aplicación de App Engine que no está protegida con Identity-Aware Proxy. Si tu aplicación de App Engine está protegida con IAP, el encabezado de solicitud HTTP que contiene el JWT de IAP es x-goog-iap-jwt-assertion
y debe validarse en consecuencia.
protocolo
Solicitud:
GET https://oauth2.googleapis.com/tokeninfo?id_token={BEARER_TOKEN}
Respuesta:
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 probar este ejemplo, sigue las instrucciones de configuración de C# que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de C# de Pub/Sub.
Go
Java
Node.js
Python
Ruby
Para obtener información sobre la variable de entorno PUBSUB_VERIFICATION_TOKEN
que se usa en los ejemplos de código anteriores, consulta Escribir y responder a mensajes de Pub/Sub.
Consulta más ejemplos sobre cómo validar el JWT del portador en esta guía del inicio de sesión de Google para sitios web. Puedes consultar una descripción general más amplia de los tokens de OpenID en la guía de OpenID Connect, que incluye una lista de bibliotecas de cliente que ayudan a validar los JWTs.
Autenticación desde otros Google Cloud servicios
Las funciones de Cloud Run y App Engine autentican las llamadas HTTP de Pub/Sub verificando los tokens generados por Pub/Sub. La única configuración que necesitas es conceder los roles de gestión de identidades y accesos necesarios a la cuenta de llamada.
Consulta las siguientes guías y tutoriales para ver diferentes casos prácticos de estos servicios:
Cloud Run
- Activación desde inserción de Pub/Sub:
tu cuenta de servicio de autenticación de inserción debe tener el rol
roles/run.invoker
y estar vinculada a un servicio de Cloud Run para invocar un servicio de Cloud Run correspondiente. - Tutorial sobre el uso de Pub/Sub con Cloud Run
App Engine
.Cloud Run Functions
- Activadores HTTP:
Tu cuenta de servicio de autenticación push debe tener el rol
roles/cloudfunctions.invoker
para invocar una función si quieres usar solicitudes push de Pub/Sub como activadores HTTP de la función. - Activadores de Google Cloud Pub/Sub: los roles y permisos de IAM se configuran automáticamente si usas activadores de Pub/Sub para invocar una función.