Accesso ad account collegato

Il collegamento dell'Account Google consente ai proprietari di Account Google di connettersi in modo rapido, semplice e sicuro ai tuoi servizi e di condividere dati con Google.

L'opzione Accedi con un account collegato attiva l'opzione Accedi con Google con un tocco per gli utenti che hanno già collegato il proprio Account Google al tuo servizio. Ciò migliora l'esperienza degli utenti perché possono accedere con un solo clic, senza dover reinserire nome utente e password. Inoltre, riduce le probabilità che gli utenti creino account duplicati nel tuo servizio.

Requisiti

Per implementare l'Accesso all'account collegato, devi soddisfare i seguenti requisiti:

  • Hai un'implementazione del collegamento OAuth dell'Account Google che supporta il flusso del codice di autorizzazione OAuth 2.0. L'implementazione OAuth deve includere i seguenti endpoint:
    • endpoint di autorizzazione per gestire le richieste di autorizzazione.
    • endpoint del token per gestire la richiesta di token di accesso e di aggiornamento.
    • endpoint userinfo per recuperare i dati di base dell'account dell'utente collegato, che vengono mostrati all'utente durante il processo di accesso all'account collegato.
  • Hai un'app Android.

Come funziona

Prerequisito : l'utente ha collegato in precedenza il proprio account Google al proprio account nel tuo servizio.

  1. Puoi attivare la visualizzazione degli account collegati durante il flusso di accesso One Tap.
  2. All'utente viene mostrata una richiesta di accesso One Tap con un'opzione per accedere al servizio con l'account collegato.
  3. Se l'utente sceglie di continuare con l'account collegato, Google invia una richiesta all'endpoint del tuo token per salvare un codice di autorizzazione. La richiesta contiene il token di accesso dell'utente emesso dal tuo servizio e un codice di autorizzazione di Google.
  4. Devi scambiare il codice di autorizzazione di Google con un token ID Google, che contiene informazioni sull'Account Google dell'utente.
  5. L'app riceve anche un token ID al termine del flusso e lo metti in corrispondenza con l'identificatore utente nel token ID ricevuto dal server per far accedere l'utente all'app.
Accesso ad account collegato.
Figura 1. Flusso di accesso ad account collegato. Se l'utente ha più account con cui ha eseguito l'accesso sul proprio dispositivo, potrebbe visualizzare un Selettore account e verrà indirizzato solo alla visualizzazione Accesso ad account collegato se seleziona un account collegato.

Implementare l'opzione Accesso con account collegato nell'app per Android

Per supportare l'accesso con l'account collegato nella tua app per Android, segui le istruzioni riportate nella Guida all'implementazione di Android.

Gestire le richieste di codici di autorizzazione provenienti da Google

Google invia una richiesta POST al tuo endpoint token per salvare un codice di autorizzazione da scambiare con il token ID dell'utente. La richiesta contiene il token di accesso dell'utente e un codice di autorizzazione OAuth2 emesso da Google.

Prima di salvare il codice di autorizzazione, devi verificare che tu abbia concesso a Google il token di accesso, identificato dal client_id.

Richiesta HTTP

Richiesta di esempio

POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=urn:ietf:params:oauth:grant-type:reciprocal
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
&access_token=ACCESS_TOKEN

L'endpoint di scambio di token deve essere in grado di gestire i seguenti parametri di richiesta:

Parametri endpoint token
code Codice di autorizzazione Google OAuth2 obbligatorio
client_id Obbligatorio ID client che hai rilasciato a Google
client_secret Obbligatorio Il client secret che hai fornito a Google
access_token Obbligatorio Token di accesso che hai emesso a Google. Lo utilizzerai per conoscere il contesto dell'utente
grant_type Il valore obbligatorio DEVE essere impostato su urn:ietf:params:oauth:grant-type:reciprocal

L'endpoint di scambio di token deve rispondere alla richiesta POST seguendo questi passaggi:

  • Verifica che il access_token sia stato concesso a Google identificato dal client_id.
  • Rispondere con una risposta HTTP 200 (OK) se la richiesta è valida e il codice di autorizzazione viene scambiato correttamente con un token ID Google oppure con un codice di errore HTTP se la richiesta non è valida.

Risposta HTTP

Operazione riuscita

Restituisce il codice di stato HTTP 200 OK

Esempio di risposta positiva
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{}

Errori

In caso di richiesta HTTP non valida, rispondi con uno dei seguenti codici di errore HTTP:

Codice di stato HTTP Body Descrizione
400 {"error": "invalid_request"} Nella richiesta manca un parametro, quindi il server non può procedere con la richiesta. Questo errore può essere restituito anche se la richiesta include un parametro non supportato o si ripete un parametro
401 {"error": "invalid_request"} Autenticazione client non riuscita, ad esempio se la richiesta contiene un ID client o un secret non validi
401 {"error": "invalid_token"}

Includere la verifica di autenticazione "WWW-Authentication: Bearer" (verifica dell'autenticazione di connessione) nell'intestazione della risposta

Il token di accesso del partner non è valido.
403 {"error": "insufficient_permission"}

Includere la verifica di autenticazione "WWW-Authentication: Bearer" (verifica dell'autenticazione di connessione) nell'intestazione della risposta

Il token di accesso partner non contiene gli ambiti necessari per eseguire il protocollo OAuth reciproco
500 {"error": "internal_error"} Errore del server

La risposta di errore deve contenere i seguenti campi :

Campi per la risposta di errore
error Stringa di errore obbligatoria
error_description Descrizione leggibile dell'errore.
error_uri URI che fornisce ulteriori dettagli sull'errore
Esempio di risposta all'errore 400
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "error": "invalid_request",
  "error_description": "Request was missing the 'access_token' parameter."
}

Scambia codice di autorizzazione per il token ID

Dovrai scambiare il codice di autorizzazione che hai ricevuto con un token ID Google contenente informazioni sull'Account Google dell'utente.

Per scambiare un codice di autorizzazione con un token ID Google, chiama l'endpoint https://oauth2.googleapis.com/token e imposta i seguenti parametri:

Campi di richiesta
client_id Obbligatorio L'ID client ottenuto dalla pagina Credenziali della console API. In genere si tratta della credenziale con il nome New Actions on Google App
client_secret Obbligatorio Il client secret ottenuto dalla pagina Credenziali della console API
code Obbligatorio Il codice di autorizzazione inviato nella richiesta iniziale.
grant_type Obbligatorio Come definito nella specifica OAuth 2.0, il valore di questo campo deve essere impostato su authorization_code.
Richiesta di esempio
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=authorization_code
&client_id=GOOGLE_CLIENT_ID
&client_secret=GOOGLE_CLIENT_SECRET

Google risponde a questa richiesta restituendo un oggetto JSON che contiene un token di accesso di breve durata e un token di aggiornamento.

La risposta contiene i seguenti campi:

Campi di risposta
access_token Token di accesso rilasciato da Google che la tua applicazione invia per autorizzare una richiesta API di Google
id_token Il token ID contiene i dati dell'Account Google dell'utente, La sezione Convalida risposta contiene dettagli su come decodificare e convalidare la risposta del token ID
expires_in La durata rimanente del token di accesso in secondi
refresh_token Un token che puoi utilizzare per ottenere un nuovo token di accesso. I token di aggiornamento sono validi finché l'utente non revoca l'accesso
scope Il valore di questo campo è sempre impostato su openid per il caso d'uso di Accesso all'account collegato
token_type Il tipo di token restituito. Al momento, il valore di questo campo è sempre impostato su Bearer
Esempio di risposta
HTTP/1.1 200 OK
Content-type: application/json; charset=utf-8

{
  "access_token": "Google-access-token",
  "id_token": "Google-ID-token",
  "expires_in": 3599,
  "token_type": "Bearer",
  "scope": "openid",
  "refresh_token": "Google-refresh-token"
}


POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=Google authorization code
&grant_type=authorization_code
&client_id=Google client id
&client_secret=Google client secret

Convalida la risposta del token ID

Convalida e decodifica l'asserzione JWT

Puoi convalidare e decodificare l'asserzione JWT utilizzando una libreria di decodifica JWT per la tua lingua . Utilizza le chiavi pubbliche di Google, disponibili nei formati JWK o PEM , per verificare la firma del token.

Quando viene decodificata, l'asserzione JWT ha l'aspetto seguente:

{
  "sub": "1234567890",      // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

Oltre a verificare la firma del token, verifica che l'emittente dell'asserzione (campo iss ) sia https://accounts.google.com , che il pubblico (campo aud ) sia l'ID client assegnato e che il token non sia scaduto ( exp campo).

Utilizzando i campi email , email_verified e hd puoi determinare se Google ospita ed è autorevole per un indirizzo email. Nei casi in cui Google è autorevole, l'utente è attualmente noto per essere il legittimo proprietario dell'account e potresti saltare la password o altri metodi di verifica. In caso contrario, questi metodi possono essere utilizzati per verificare l'account prima del collegamento.

Casi in cui Google è autorevole:

  • email ha un suffisso @gmail.com , questo è un account Gmail.
  • email_verified è vero e hd è impostato, questo è un account G Suite.

Gli utenti possono registrarsi per gli account Google senza utilizzare Gmail o G Suite. Quando l' email non contiene un suffisso @gmail.com e hd è assente, Google non è autorevole e si consigliano password o altri metodi di verifica per verificare l'utente. email_verfied può anche essere vero poiché Google ha verificato inizialmente l'utente quando è stato creato l'account Google, tuttavia la proprietà dell'account di posta elettronica di terze parti potrebbe essere cambiata da allora.