Se una sottoscrizione push utilizza l'autenticazione, il servizio Pub/Sub firma un JWT e invia il JWT nell'intestazione di autorizzazione della richiesta push. Il JWT include rivendicazioni e una firma.
Gli abbonati possono convalidare il JWT e verificare quanto segue:
- Le dichiarazioni sono accurate.
- Il servizio Pub/Sub ha firmato le attestazioni.
Se gli abbonati utilizzano un firewall, non possono ricevere richieste push. Per ricevere le richieste push, devi disattivare il firewall e verificare il JWT.
Prima di iniziare
- Scopri di più sugli abbonamenti.
- Scopri come funzionano gli abbonamenti push.
- Crea un abbonamento push.
Formato JWT
Il JWT è un JWT OpenIDConnect costituito da un'intestazione, un set di attestazioni e una firma. Il servizio Pub/Sub codifica il JWT come stringa base64 con delimitatori di punto.
Ad esempio, la seguente intestazione di autorizzazione include un JWT codificato:
"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'insieme di intestazioni e attestazioni sono stringhe JSON. Una volta decodificati, assumono la forma seguente:
{"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" }
I token associati alle richieste inviate agli endpoint push potrebbero risalire fino a un'ora prima.
Configurare Pub/Sub per l'autenticazione push
L'esempio seguente mostra come impostare l'account di servizio dell'autenticazione push su un account di servizio a tua scelta e come concedere all'account di servizio gestito da Google
service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
il ruolo iam.serviceAccountTokenCreator
.
Console
Vai alla pagina Sottoscrizioni Pub/Sub.
Fai clic su Crea sottoscrizione.
Nel campo ID abbonamento, inserisci un nome.
Seleziona un argomento.
Seleziona Push come Tipo di pubblicazione.
Inserisci l'URL di un endpoint.
Seleziona Attiva autenticazione.
Seleziona un account di servizio.
Assicurati che l'account di servizio gestito da Google
service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
abbia il ruoloiam.serviceAccountTokenCreator
nella dashboard IAM del tuo progetto. Se all'account di servizio non è stato concesso il ruolo, fai clic su Concedi nella dashboard IAM per farlo.(Facoltativo) Inserisci un segmento di pubblico.
Fai clic su Crea.
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 Google-managed service account # `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'
Quando attivi l'autenticazione per un abbonamento push, potresti riscontrare un errore permission denied
o not authorized
.
Per risolvere il problema, concedi all'entità che avvia la creazione o l'aggiornamento dell'abbonamento l'autorizzazione iam.serviceAccounts.actAs
nell'account di servizio. Per ulteriori informazioni, consulta la sezione Autenticazione in "Creare sottoscrizioni push".
Se utilizzi un abbonamento push autenticato con un'applicazione App Engine protetta con Identity-Aware Proxy, devi fornire l'ID client IAP come pubblico del token di autenticazione push.
Per abilitare IAP nella tua applicazione App Engine, consulta Abilitazione di IAP.
Per trovare l'ID client IAP, cerca l'ID client IAP-App-Engine-app
nella pagina Credenziali.
Richieste di indennizzo
Il JWT può essere utilizzato per verificare che le dichiarazioni, incluse quelle email
e aud
, siano firmate da Google. Per saperne di più su come le API OAuth 2.0 di Google possono essere utilizzate sia per l'autenticazione che per l'autorizzazione, consulta OpenID Connect.
Esistono due meccanismi che rendono queste affermazioni significative. Innanzitutto, Pub/Sub richiede che l'account utente o di servizio che effettua la chiamata CreateSubscription, UpdateSubscription o ModificaPushConfig abbia un ruolo con l'autorizzazione iam.serviceAccounts.actAs
nell'account di servizio di autenticazione push. Un esempio di questo ruolo è il ruolo roles/iam.serviceAccountUser
.
Secondo, l'accesso ai certificati utilizzati per firmare i token è strettamente controllato. Per creare il token, Pub/Sub deve chiamare un servizio Google interno utilizzando un'identità dell'account di servizio di firma separata, ovvero l'account di servizio gestito da Google service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
.
Questo account di servizio di firma deve avere l'autorizzazione iam.serviceAccounts.getOpenIdToken
o un ruolo Creatore token account di servizio (roles/iam.serviceAccountTokenCreator
) nell'account di servizio di autenticazione push (o su qualsiasi risorsa predecessore, ad esempio il progetto, dell'account di servizio di autenticazione push).
Convalida token
La convalida dei token inviati da Pub/Sub all'endpoint push riguarda:
- Controllo dell'integrità del token mediante la convalida della firma.
- Assicurarsi che le attestazioni email e audience nel token corrispondano ai valori impostati nella configurazione dell'abbonamento push.
L'esempio seguente illustra come autenticare una richiesta push a un'applicazione App Engine non protetta con Identity-Aware Proxy. Se la tua applicazione App Engine è protetta con IAP, l'intestazione della richiesta HTTP che contiene il JWT IAP è x-goog-iap-jwt-assertion
e deve essere convalidata di conseguenza.
protocollo
Richiesta:
GET https://oauth2.googleapis.com/tokeninfo?id_token={BEARER_TOKEN}
Risposta:
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#
Prima di provare questo esempio, segui le istruzioni di configurazione di C# nella Guida rapida sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API C# di Pub/Sub.
Go
Java
Node.js
Python
Ruby
Per informazioni sulla variabile di ambiente PUBSUB_VERIFICATION_TOKEN
utilizzata negli esempi di codice sopra riportati, consulta Scrittura e risposta ai messaggi Pub/Sub.
Puoi trovare ulteriori esempi su come convalidare il JWT di connessione in questa guida per l'accesso con Google per i siti web. Una panoramica più ampia dei token OpenID è disponibile nella guida alla connessione a OpenID, che include un elenco di librerie client che consentono di convalidare i JWT.
Autenticazione da altri servizi Google Cloud
Cloud Run, App Engine e Cloud Functions autenticano le chiamate HTTP da Pub/Sub verificando i token generati da Pub/Sub. L'unica configurazione di cui hai bisogno è concedere i ruoli IAM necessari all'account chiamante.
Consulta le guide e i tutorial seguenti per diversi casi d'uso con questi servizi:
Cloud Run
- Attivazione da push di Pub/Sub:
il tuo account di servizio di autenticazione push deve avere il ruolo
roles/run.invoker
ed essere associato a un servizio Cloud Run per richiamare un servizio Cloud Run corrispondente - Tutorial sull'utilizzo di Pub/Sub con Cloud Run
App Engine
Cloud Functions
- Trigger HTTP: il tuo account di servizio di autenticazione push deve avere il ruolo
roles/cloudfunctions.invoker
per richiamare una funzione se intendi utilizzare le richieste push di Pub/Sub come trigger HTTP per la funzione - Trigger di Google Cloud Pub/Sub: i ruoli e le autorizzazioni IAM vengono configurati automaticamente se utilizzi i trigger Pub/Sub per richiamare una funzione.