Per supportare il flusso implicito OAuth 2.0, il tuo servizio rende disponibile un endpoint di autorizzazione tramite HTTPS. Questo endpoint è responsabile dell'autenticazione e dell'ottenimento del consenso degli utenti per l'accesso ai dati. L'endpoint di autorizzazione presenta un'interfaccia utente di accesso agli utenti che non hanno ancora eseguito l'accesso e registra il consenso all'accesso richiesto.
Quando un'applicazione Google deve chiamare una delle API autorizzate del tuo servizio, Google utilizza questo endpoint per ottenere l'autorizzazione dagli utenti a chiamare queste API per loro conto.
Collegamento dell'Account Google: flusso implicito OAuth
Il seguente diagramma di sequenza descrive in dettaglio le interazioni tra l'utente, Google e gli endpoint del tuo servizio.
Ruoli e responsabilità
La tabella seguente definisce i ruoli e le responsabilità degli attori nel flusso implicito OAuth di collegamento dell'Account Google (GAL). Tieni presente che in GAL Google funge da client OAuth, mentre il tuo servizio funge da provider di identità/servizi.
| Attore / componente | Ruolo GAL | Responsabilità |
|---|---|---|
| App / server Google | Client OAuth | Avvia il flusso, riceve il token di accesso utilizzando un reindirizzamento del browser, e lo archivia in modo sicuro per accedere alle API del tuo servizio. |
| Endpoint di autorizzazione | Server di autorizzazione | Autentica gli utenti, ottiene il loro consenso ed emette token di accesso di lunga durata accesso direttamente a Google. |
| URI di reindirizzamento di Google | Endpoint di richiamata | Riceve il reindirizzamento dell'utente dal tuo servizio di autorizzazione con i
access_token e state valori nel frammento dell'URL. |
Una tipica sessione di flusso implicito OAuth 2.0 avviata da Google ha il seguente flusso:
- Google apre l'endpoint di autorizzazione nel browser dell'utente. L'utente esegue l'accesso, se non l'ha già fatto, e concede a Google l'autorizzazione ad accedere ai suoi dati con la tua API, se non l'ha già fatto.
- Il tuo servizio crea un token di accesso e lo restituisce a Google. Per farlo, reindirizza il browser dell'utente a Google con il token di accesso allegato alla richiesta.
- Google chiama le API del tuo servizio e allega il token di accesso a ogni richiesta. Il tuo servizio verifica che il token di accesso conceda a Google l'autorizzazione ad accedere all'API e poi completa la chiamata API.
Ricetta di implementazione
Per implementare il flusso implicito, segui questi passaggi.
Passaggio 1: gestisci le richieste di autorizzazione
Quando Google avvia il collegamento dell'account, reindirizza l'utente al tuo endpoint di autorizzazione. Per i contratti di protocollo dettagliati e i requisiti dei parametri, consulta Endpoint di autorizzazione.
Per gestire la richiesta, esegui le seguenti azioni:
Convalida la richiesta:
- Verifica che
client_idcorrisponda all'ID client assegnato a Google. - Verifica che
redirect_uricorrisponda all'URL di reindirizzamento di Google previsto:none https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID - Verifica che
response_typesiatoken.
- Verifica che
Autentica l'utente:
- Verifica se l'utente ha eseguito l'accesso al tuo servizio.
- Se l'utente non ha eseguito l'accesso, chiedigli di completare il flusso di accesso o registrazione.
Genera il token di accesso:
- Crea un token di accesso univoco e non indovinabile associato all'utente e al client.
Reindirizza a Google:
- Reindirizza il browser all'URL fornito in
redirect_uri. - Aggiungi i seguenti parametri nel frammento di URL (hash):
access_token: il token di accesso che hai generato.token_type: deve esserebearer.state: il valore dello stato non modificato ricevuto da Google.
- Reindirizza il browser all'URL fornito in
Gestire le richieste di informazioni utente
L'endpoint userinfo è una risorsa protetta da OAuth 2.0 che restituisce attestazioni sull'utente collegato. L'implementazione e l'hosting dell'endpoint userinfo sono facoltative, ad eccezione dei seguenti casi d'uso:
- Accesso a un account collegato con Google One Tap.
- Abbonamento senza problemi su AndroidTV.
Dopo che il token di accesso è stato recuperato correttamente dall'endpoint del token, Google invia una richiesta all'endpoint userinfo per recuperare le informazioni di base del profilo dell'utente collegato.
| intestazioni delle richieste endpoint userinfo | |
|---|---|
Authorization header |
Il token di accesso di tipo Bearer. |
Ad esempio, se l'endpoint userinfo è disponibile su
https://myservice.example.com/userinfo, una richiesta potrebbe avere il seguente aspetto:
GET /userinfo HTTP/1.1 Host: myservice.example.com Authorization: Bearer ACCESS_TOKEN
Affinché l'endpoint userinfo possa gestire le richieste, segui questi passaggi:
- Estrai il token di accesso dall'intestazione Autorizzazione e restituisci le informazioni per l'utente associato al token di accesso.
- Se il token di accesso non è valido, restituisce un errore HTTP 401 Autorizzazione non autorizzata utilizzando l'intestazione della risposta
WWW-Authenticate. Di seguito è riportato un esempio di risposta di errore userinfo: Se durante la procedura di collegamento viene restituito un errore 401 Autorizzazione o qualsiasi altra risposta di errore non riuscita durante la procedura di collegamento, l'errore non sarà recuperabile, il token recuperato verrà eliminato e l'utente dovrà avviare nuovamente la procedura di collegamento.HTTP/1.1 401 Unauthorized WWW-Authenticate: error="invalid_token", error_description="The Access Token expired"
Se il token di accesso è valido, restituisce e invia una risposta HTTP 200 con il seguente oggetto JSON nel corpo dell'HTTPS risposta:
Se l'endpoint userinfo restituisce una risposta HTTP 200 riuscita, il token e le attestazioni recuperati vengono registrati in base all'Account Google dell'utente.{ "sub": "USER_UUID", "email": "EMAIL_ADDRESS", "given_name": "FIRST_NAME", "family_name": "LAST_NAME", "name": "FULL_NAME", "picture": "PROFILE_PICTURE", }risposta endpoint userinfo subUn ID univoco che identifica l'utente nel sistema. emailIndirizzo email dell'utente. given_nameFacoltativo:nome dell'utente. family_nameFacoltativo:il cognome dell'utente. nameFacoltativo:nome completo dell'utente. picture(Facoltativo) Immagine del profilo dell'utente.