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 Accesso a un account collegato attiva l'opzione Accedi con Google con un tocco per gli utenti che hanno già il proprio Account Google collegato al 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 ad account collegato, devi soddisfare i seguenti requisiti:
- Disponi di 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 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 la procedura di accesso all'account collegato.
- Hai un'app Android.
Come funziona
Prerequisito : l'utente ha precedentemente collegato il suo Account Google al suo account nel tuo servizio.
- Puoi scegliere di mostrare gli account collegati durante il flusso di accesso One Tap.
- All'utente viene mostrata una richiesta di accesso con un tocco con un'opzione per accedere al servizio con l'account collegato.
- 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.
- Sostituisci il codice di autorizzazione Google con un token ID Google, che contiene informazioni sull'Account Google dell'utente.
- L'app riceve anche un token ID al termine del flusso che lo associ all'identificatore utente nel token ID che è stato ricevuto dal tuo server per far accedere l'utente alla tua app.
Implementare l'accesso con account collegato nell'app Android
Per supportare l'accesso con 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 effettua una richiesta POST all'endpoint del token per salvare un codice di autorizzazione che scambi 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 il token di accesso ti sia stato concesso a Google, 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 |
Obbligatorio Codice di autorizzazione Google OAuth2 |
client_id |
Obbligatorio ID client che hai rilasciato a Google |
client_secret |
Obbligatorio Client secret che hai fornito a Google |
access_token |
Obbligatorio Token di accesso che hai emesso a Google. Potrai utilizzare questi dati 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 nel seguente modo:
- Verifica che il
access_token
sia stato concesso a Google identificato dalclient_id
. - Rispondi 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 | Corpo | 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 ne ripete uno |
401 | {"error": "invalid_request"} |
L'autenticazione client non è riuscita, ad esempio se la richiesta contiene un ID client o un secret non valido |
401 | {"error": "invalid_token"}
Includere la richiesta di autenticazione "WWW-Authentication: Bearer" nell'intestazione della risposta |
Il token di accesso del partner non è valido. |
403 | {"error": "insufficient_permission"}
Includere la richiesta di autenticazione "WWW-Authentication: Bearer" nell'intestazione della risposta |
Il token di accesso del partner non contiene gli ambiti necessari per eseguire OAuth reciproco |
500 | {"error": "internal_error"} |
Errore del server |
La risposta di errore deve contenere i seguenti campi :
Campi 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."
}
Codice di autorizzazione di scambio 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 denominata 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 contenente 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 emesso 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 i 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 Accesso a un 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 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 ehd
è 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.