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 reclamaciones 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 deniederror.
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 asignar a la cuenta de servicio de autenticación push la cuenta de servicio que elijas 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 entrega.
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.comtenga el roliam.serviceAccountTokenCreatoren 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 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.