Si un abonnement push utilise l'authentification, le service Pub/Sub signe un jeton JWT et l'envoie dans l'en-tête d'autorisation de la requête push. Le jeton JWT inclut des revendications et une signature.
Les abonnés peuvent valider le jeton JWT et vérifier les points suivants:
- Les revendications sont exactes.
- Le service Pub/Sub a signé les revendications.
Si les abonnés utilisent un pare-feu, ils ne peuvent pas recevoir de requêtes push. Pour recevoir des requêtes push, vous devez désactiver le pare-feu et vérifier le jeton JWT.
Avant de commencer
- En savoir plus sur les abonnements
- Comprendre le fonctionnement des abonnements push
- Créez un abonnement push.
Format JWT
Le jeton JWT est un jeton JWT OpenIDConnect composé d'un en-tête, d'un ensemble de revendications et d'une signature. Le service Pub/Sub encode le jeton JWT en tant que chaîne en base64 avec des délimiteurs de points.
Par exemple, l'en-tête d'autorisation suivant inclut un jeton JWT encodé :
"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"
L'en-tête et l'ensemble de revendications sont des chaînes JSON. Une fois décodés, ils prennent la forme suivante :
{"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" }
Les jetons associés aux requêtes envoyées aux points de terminaison push peuvent remonter jusqu'à une heure.
Configurer Pub/Sub pour l'authentification push
L'exemple suivant montre comment définir le compte de service d'authentification par poussée sur un compte de service de votre choix et comment accorder le rôle iam.serviceAccountTokenCreator
à l'agent de service service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
.
Console
Accédez à la page Abonnements Pub/Sub.
Cliquez sur Créer un abonnement.
Dans le champ ID d'abonnement, saisissez un nom.
Sélectionnez un sujet.
Sélectionnez Push comme Type de diffusion.
Saisissez une URL de point de terminaison.
Cochez la case Activer l'authentification.
Sélectionnez un compte de service.
Assurez-vous que l'agent de service
service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
dispose du rôleiam.serviceAccountTokenCreator
dans le tableau de bord IAM de votre projet. Si le rôle n'a pas été attribué au compte de service, cliquez sur Accorder dans le tableau de bord IAM.Facultatif: Saisissez une audience.
Cliquez sur Créer.
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'
Lorsque vous activez l'authentification pour un abonnement push, une erreur permission denied
ou not authorized
peut se produire.
Pour résoudre ce problème, accordez au principal à l'origine de la création ou de la mise à jour de l'abonnement l'autorisation iam.serviceAccounts.actAs
sur le compte de service. Pour en savoir plus, consultez la section Authentification dans "Créer des abonnements push".
Si vous utilisez un abonnement push authentifié avec une application App Engine sécurisée par Identity-Aware Proxy, vous devez fournir l'ID client IAP comme audience du jeton d'authentification push.
Pour activer IAP sur votre application App Engine, consultez la section Activer IAP.
Pour trouver l'ID client IAP, recherchez l'ID client IAP-App-Engine-app
sur la page Identifiants.
Revendications
Un jeton JWT peut être utilisé pour valider que les revendications (y compris les revendications par email
et aud
) sont signées par Google. Pour plus d'informations sur la manière dont les API OAuth 2.0 de Google peuvent être utilisées à la fois pour l'authentification et l'autorisation, consultez la documentation sur OpenID Connect.
Deux mécanismes rendent ces revendications significatives. Tout d'abord, Pub/Sub requiert que l'utilisateur ou le compte de service effectuant l'appel CreateSubscription, UpdateSubscription ou ModifyPushConfig dispose d'un rôle avec l'autorisation iam.serviceAccounts.actAs
sur le compte de service d'authentification push. Le rôle roles/iam.serviceAccountUser
en est un exemple.
Deuxièmement, l'accès aux certificats utilisés pour signer les jetons est étroitement contrôlé. Pour créer le jeton, Pub/Sub doit appeler un service Google interne en utilisant une identité de compte de service de signature distincte, qui est l'agent de service service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
.
Ce compte de service de signature doit disposer de l'autorisation iam.serviceAccounts.getOpenIdToken
ou d'un rôle Créateur de jetons du compte de service (roles/iam.serviceAccountTokenCreator
) sur le compte de service d'authentification par poussée (ou sur toute ressource ancestrale, telle que le projet, du compte de service d'authentification par poussée).
Valider des jetons
La validation des jetons envoyés par Pub/Sub au point de terminaison push implique les actions suivantes :
- Vérifier l'intégrité du jeton à l'aide de la validation de signature.
- S'assurer que les revendications email et audience du jeton correspondent aux valeurs définies dans la configuration de l'abonnement push.
L'exemple suivant montre comment authentifier une requête push auprès d'une application App Engine non sécurisée avec Identity-Aware Proxy. Si votre application App Engine est sécurisée avec IAP, l'en-tête de requête HTTP contenant le JWT IAP est x-goog-iap-jwt-assertion
et doit être validé en conséquence.
protocol
Requête :
GET https://oauth2.googleapis.com/tokeninfo?id_token={BEARER_TOKEN}
Réponse :
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#
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage C# qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour C#.
Go
Java
Node.js
Python
Ruby
Pour en savoir plus sur la variable d'environnement PUBSUB_VERIFICATION_TOKEN
utilisée dans les exemples de code ci-dessus, consultez la section Écrire des messages Pub/Sub et y répondre.
Vous trouverez des exemples supplémentaires sur la validation du support JWT dans le guide de connexion à Google pour les sites Web. Une présentation plus complète des jetons OpenID est disponible dans le guide OpenID Connect, et comprend une liste de bibliothèques clientes qui utiles pour valider les jetons JWT.
Authentification à partir d'autres services Google Cloud
Cloud Run, App Engine et les fonctions Cloud Run authentifient les appels HTTP à partir de Pub/Sub en vérifiant les jetons générés par Pub/Sub. La seule configuration requise est d'accorder les rôles IAM nécessaires au compte de l'appelant.
Consultez les guides et tutoriels suivants pour découvrir les différents cas d'utilisation de ces services:
Cloud Run
- Déclenchement à partir d'un push Pub/Sub : votre compte de service d'authentification push doit disposer du rôle
roles/run.invoker
et être associé à un service Cloud Run pour appeler un service Cloud Run correspondant. - Tutoriel : Utiliser Pub/Sub avec Cloud Run
App Engine
Cloud Run Functions
- Déclencheurs HTTP : votre compte de service d'authentification push doit disposer du rôle
roles/cloudfunctions.invoker
pour appeler une fonction si vous prévoyez d'utiliser des requêtes push Pub/Sub comme déclencheurs HTTP pour la fonction. - Déclencheurs Google Cloud Pub/Sub : les rôles et autorisations IAM sont configurés automatiquement si vous utilisez des déclencheurs Pub/Sub pour appeler une fonction.