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 éléments 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
- Découvrez 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 Une chaîne en base64 avec des délimiteurs de point.
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 push
un compte de service de votre choix et comment accorder
le rôle iam.serviceAccountTokenCreator
au
service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
agent de service.
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 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
a la le rôleiam.serviceAccountTokenCreator
dans le rôle tableau de bord IAM. Si le compte de service n'a pas reçu le rôle, cliquez sur Attribuer. 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, vous pouvez rencontrer une erreur permission denied
ou not authorized
.
Pour résoudre ce problème, attribuez au compte principal qui est à l'origine de la création ou de la mise à jour de l'abonnement
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
Activez IAP.
Pour trouver l'ID client IAP, recherchez l'ID client IAP-App-Engine-app
sur la
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
service Google à l'aide d'une identité de compte de service de signature distincte,
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 par IAP, l'en-tête de requête HTTP qui contient
Le jeton 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 du mode push Pub/Sub:
Votre compte de service d'authentification push doit disposer du
roles/run.invoker
et être lié à un service Cloud Run pour appeler service Cloud Run correspondant - Tutoriel : Utiliser Pub/Sub avec Cloud Run
App Engine
Fonctions Cloud Run
- Déclencheurs HTTP:
Votre compte de service d'authentification push doit disposer du
roles/cloudfunctions.invoker
pour appeler une fonction si vous avez l'intention d'utiliser le mode push Pub/Sub en tant que déclencheurs HTTP de la fonction - Déclencheurs Google Cloud Pub/Sub: Les rôles et autorisations IAM sont configurés automatiquement si vous utilisez Déclencheurs Pub/Sub pour appeler une fonction