Panoramica
Il collegamento semplificato di Accedi con Google basato su OAuth aggiunge Accedi con Google a l collegamento OAuth. In questo modo, gli utenti Google possono collegare i propri account in modo semplice e creare un nuovo account sul tuo servizio utilizzando il proprio Account Google.
Per eseguire il collegamento dell'account con OAuth e Accedi con Google, segui questi passaggi generali:
- Innanzitutto, chiedi all'utente di dare il consenso per accedere al suo profilo Google.
- Utilizza le informazioni del profilo per verificare se l'account utente esiste.
- Per gli utenti esistenti, collega gli account.
- Se non riesci a trovare una corrispondenza per l'utente Google nel tuo sistema di autenticazione, convalida il token ID ricevuto da Google. Poi, puoi creare un utente in base alle informazioni del profilo contenute nel token ID.
Figura 1. Collegamento dell'account sullo smartphone di un utente con il collegamento semplificato
Requisiti per il collegamento semplificato
- Implementa il flusso di collegamento OAuth web di base. Il tuo servizio deve supportare gli endpoint di autorizzazione e scambio di token conformi a OAuth 2.0.
- L'endpoint di scambio di token deve supportare le asserzioni JWT (JSON Web Token) e implementare gli intent
check,createeget.
Implementare il server OAuth
L'endpoint di scambio di token deve supportare gli intent check, create e get.
Segui questi passaggi per completare il flusso di collegamento dell'account e scoprire quando vengono utilizzati i diversi intent:
- L'utente ha un account nel tuo sistema di autenticazione? (L'utente decide selezionando SÌ o NO)
- SÌ : l'utente utilizza l'indirizzo email associato al suo Account Google per accedere alla tua piattaforma? (L'utente decide selezionando SÌ o NO)
- SÌ : l'utente ha un account corrispondente nel tuo sistema di autenticazione? (
check intentviene chiamato per confermare)- SÌ :
get intentviene chiamato e l'account viene collegato se l'intent get viene restituito correttamente. - NO : creare un nuovo account? (L'utente decide selezionando SÌ o NO)
- SÌ : viene chiamato
create intente l'account viene collegato se l'intent create viene restituito correttamente. - NO : viene attivato il flusso OAuth web, l'utente viene indirizzato al browser e gli viene data la possibilità di collegare un altro indirizzo email.
- SÌ : viene chiamato
- SÌ :
- NO : viene attivato il flusso OAuth web, l'utente viene indirizzato al browser e gli viene data la possibilità di collegare un altro indirizzo email.
- SÌ : l'utente ha un account corrispondente nel tuo sistema di autenticazione? (
- NO : l'utente ha un account corrispondente nel tuo sistema di autenticazione? (
check intentviene chiamato per confermare)- SÌ :
get intentviene chiamato e l'account viene collegato se l'intent get viene restituito correttamente. - NO :
create intentviene chiamato e l'account viene collegato se l'intent create viene restituito correttamente.
- SÌ :
- SÌ : l'utente utilizza l'indirizzo email associato al suo Account Google per accedere alla tua piattaforma? (L'utente decide selezionando SÌ o NO)
Check for an existing user account (check intent)
After the user gives consent to access their Google profile, Google sends a request that contains a signed assertion of the Google user's identity. The assertion contains information that includes the user's Google Account ID, name, and email address. The token exchange endpoint configured for your project handles that request.
If the corresponding Google account is already present in your authentication
system, your token exchange endpoint responds with account_found=true. If the
Google account doesn't match an existing user, your token exchange endpoint
returns an HTTP 404 Not Found error with account_found=false.
The request has the following form:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=check&assertion=JWT&scope=SCOPES&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
Your token exchange endpoint must be able to handle the following parameters:
| Token endpoint parameters | |
|---|---|
intent |
For these requests, the value of this parameter is
check. |
grant_type |
The type of token being exchanged. For these requests, this
parameter has the value urn:ietf:params:oauth:grant-type:jwt-bearer. |
assertion |
A JSON Web Token (JWT) that provides a signed assertion of the Google user's identity. The JWT contains information that includes the user's Google Account ID, name, and email address. |
client_id |
The client ID you assigned to Google. |
client_secret |
The client secret you assigned to Google. |
To respond to the check intent requests, your token exchange endpoint must perform the following steps:
- Validate and decode the JWT assertion.
- Check if the Google account is already present in your authentication system.
convalida e decodifica l'asserzione JWT
Puoi convalidare e decodificare l'asserzione JWT utilizzando un Libreria di decodifica JWT per la tua lingua. Utilizza le funzionalità di Chiavi pubbliche di Google, disponibili in JWK o formati PEM, per verificare la firma del token.
Una volta decodificata, l'asserzione JWT è simile all'esempio 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'asserzione
l'emittente (campo iss) è https://accounts.google.com, che il pubblico
(campo aud) è l'ID cliente che ti è stato assegnato e che il token non è scaduto
(campo exp).
Utilizzando i campi email, email_verified e hd puoi determinare se
Google ospita un indirizzo email ed è autorevole. Nei casi in cui Google
ufficiale che l'utente sia attualmente noto per essere il legittimo proprietario dell'account
e puoi saltare l'uso della password o altri metodi di verifica. In caso contrario, questi metodi
può essere utilizzato per verificare l'account prima del collegamento.
Casi in cui Google è autorevole:
emailha un suffisso@gmail.com, questo è un account Gmail.email_verifiedè true ehdè impostato, questo è un account G Suite.
Gli utenti possono registrarsi per creare Account Google senza utilizzare Gmail o G Suite. Quando
email non contiene un suffisso @gmail.com e hd non è presente
autoritativi e con password o altri metodi di verifica per verificare
per l'utente. Il valore email_verified può anche essere vero perché Google ha verificato inizialmente il valore
all'utente quando è stato creato l'account Google, ma la proprietà della terza parte
l'account email potrebbe essere cambiato da allora.
Check if the Google account is already present in your authentication system
Check whether either of the following conditions are true:
- The Google Account ID, found in the assertion's
subfield, is in your user database. - The email address in the assertion matches a user in your user database.
If either condition is true, the user has already signed up. In that case, return a response like the following:
HTTP/1.1 200 Success
Content-Type: application/json;charset=UTF-8
{
"account_found":"true",
}
If neither the Google Account ID nor the email address specified in the
assertion matches a user in your database, the user hasn't signed up yet. In
this case, your token exchange endpoint needs to reply with a HTTP 404 error
that specifies "account_found": "false", as in the following example:
HTTP/1.1 404 Not found
Content-Type: application/json;charset=UTF-8
{
"account_found":"false",
}
Handle automatic linking (get intent)
After the user gives consent to access their Google profile, Google sends a request that contains a signed assertion of the Google user's identity. The assertion contains information that includes the user's Google Account ID, name, and email address. The token exchange endpoint configured for your project handles that request.
If the corresponding Google Account is already present in your authentication
system, your token exchange endpoint returns a token for the user. If the
Google Account doesn't match an existing user, your token exchange endpoint
returns a linking_error error and optional login_hint.
The request has the following form:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=get&assertion=JWT&scope=SCOPES&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
Your token exchange endpoint must be able to handle the following parameters:
| Token endpoint parameters | |
|---|---|
intent |
For these requests, the value of this parameter is get. |
grant_type |
The type of token being exchanged. For these requests, this
parameter has the value urn:ietf:params:oauth:grant-type:jwt-bearer. |
assertion |
A JSON Web Token (JWT) that provides a signed assertion of the Google user's identity. The JWT contains information that includes the user's Google Account ID, name, and email address. |
scope |
Optional: Any scopes that you've configured Google to request from users. |
client_id |
The client ID you assigned to Google. |
client_secret |
The client secret you assigned to Google. |
To respond to the get intent requests, your token exchange endpoint must perform the following steps:
- Validate and decode the JWT assertion.
- Check if the Google account is already present in your authentication system.
convalida e decodifica l'asserzione JWT
Puoi convalidare e decodificare l'asserzione JWT utilizzando un Libreria di decodifica JWT per la tua lingua. Utilizza le funzionalità di Chiavi pubbliche di Google, disponibili in JWK o formati PEM, per verificare la firma del token.
Una volta decodificata, l'asserzione JWT è simile all'esempio 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'asserzione
l'emittente (campo iss) è https://accounts.google.com, che il pubblico
(campo aud) è l'ID cliente che ti è stato assegnato e che il token non è scaduto
(campo exp).
Utilizzando i campi email, email_verified e hd puoi determinare se
Google ospita un indirizzo email ed è autorevole. Nei casi in cui Google
ufficiale che l'utente sia attualmente noto per essere il legittimo proprietario dell'account
e puoi saltare l'uso della password o altri metodi di verifica. In caso contrario, questi metodi
può essere utilizzato per verificare l'account prima del collegamento.
Casi in cui Google è autorevole:
emailha un suffisso@gmail.com, questo è un account Gmail.email_verifiedè true ehdè impostato, questo è un account G Suite.
Gli utenti possono registrarsi per creare Account Google senza utilizzare Gmail o G Suite. Quando
email non contiene un suffisso @gmail.com e hd non è presente
autoritativi e con password o altri metodi di verifica per verificare
per l'utente. Il valore email_verified può anche essere vero perché Google ha verificato inizialmente il valore
all'utente quando è stato creato l'account Google, ma la proprietà della terza parte
l'account email potrebbe essere cambiato da allora.
Check if the Google account is already present in your authentication system
Check whether either of the following conditions are true:
- The Google Account ID, found in the assertion's
subfield, is in your user database. - The email address in the assertion matches a user in your user database.
If an account is found for the user, issue an access token and return the values in a JSON object in the body of your HTTPS response, like in the following example:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
In some cases, account linking based on ID token might fail for the user. If it
does so for any reason, your token exchange endpoint needs to reply with a HTTP
401 error that specifies error=linking_error, as the following example shows:
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"error":"linking_error",
"login_hint":"foo@bar.com"
}
When Google receives a 401 error response with linking_error, Google sends
the user to your authorization endpoint with login_hint as a parameter. The
user completes account linking using the OAuth linking flow in their browser.
Gestire la creazione dell'account utilizzando Accedi con Google (intent=create)
Quando un utente deve creare un account sul tuo servizio, Google invia una richiesta al tuo endpoint di scambio di token che specifica intent=create.
La richiesta ha il seguente formato:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded response_type=token&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=SCOPES&intent=create&assertion=JWT&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
L'endpoint di scambio di token deve essere in grado di gestire i seguenti parametri:
| Parametri dell'endpoint token | |
|---|---|
intent |
Per queste richieste, il valore di questo parametro è create. |
grant_type |
Il tipo di token scambiato. Per queste richieste, questo
parametro ha il valore urn:ietf:params:oauth:grant-type:jwt-bearer. |
assertion |
Un token JWT (JSON Web Token) che fornisce un'asserzione firmata dell'identità dell'utente Google Il JWT contiene informazioni che includono l'ID Account Google, il nome e l'indirizzo email dell'utente. |
client_id |
L'ID client che hai assegnato a Google. |
client_secret |
Il client secret che hai assegnato a Google. |
Il JWT all'interno del parametro assertion contiene l'ID Account Google, il nome e l'indirizzo email dell'utente, che puoi utilizzare per creare un nuovo account sul tuo servizio.
Per rispondere alle richieste di intent create, l'endpoint di scambio di token deve eseguire i seguenti passaggi:
- Convalidare e decodificare l'asserzione JWT.
- Convalidare i dati dell'utente e creare un nuovo account.
convalida e decodifica l'asserzione JWT
Puoi convalidare e decodificare l'asserzione JWT utilizzando un Libreria di decodifica JWT per la tua lingua. Utilizza le funzionalità di Chiavi pubbliche di Google, disponibili in JWK o formati PEM, per verificare la firma del token.
Una volta decodificata, l'asserzione JWT è simile all'esempio 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'asserzione
l'emittente (campo iss) è https://accounts.google.com, che il pubblico
(campo aud) è l'ID cliente che ti è stato assegnato e che il token non è scaduto
(campo exp).
Utilizzando i campi email, email_verified e hd puoi determinare se
Google ospita un indirizzo email ed è autorevole. Nei casi in cui Google
ufficiale che l'utente sia attualmente noto per essere il legittimo proprietario dell'account
e puoi saltare l'uso della password o altri metodi di verifica. In caso contrario, questi metodi
può essere utilizzato per verificare l'account prima del collegamento.
Casi in cui Google è autorevole:
emailha un suffisso@gmail.com, questo è un account Gmail.email_verifiedè true ehdè impostato, questo è un account G Suite.
Gli utenti possono registrarsi per creare Account Google senza utilizzare Gmail o G Suite. Quando
email non contiene un suffisso @gmail.com e hd non è presente
autoritativi e con password o altri metodi di verifica per verificare
per l'utente. Il valore email_verified può anche essere vero perché Google ha verificato inizialmente il valore
all'utente quando è stato creato l'account Google, ma la proprietà della terza parte
l'account email potrebbe essere cambiato da allora.
Convalidare i dati dell'utente e creare un nuovo account
Verifica se è vera una delle due seguenti condizioni:
- L'ID Account Google, che si trova nel campo
subdell'asserzione, è presente nel tuo database utenti. - L'indirizzo email nell'asserzione corrisponde a un utente nel tuo database utenti.
Se una delle due condizioni è vera, chiedi all'utente di collegare il suo account esistente al suo Account Google. Per farlo, rispondi alla richiesta con un errore HTTP 401 che specifica error=linking_error e indica l'indirizzo email dell'utente come login_hint. Di seguito è riportato un esempio di risposta:
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"error":"linking_error",
"login_hint":"foo@bar.com"
}
Quando Google riceve una risposta di errore 401 con linking_error, invia l'utente al tuo endpoint di autorizzazione con login_hint come parametro. L'utente completa il collegamento dell'account utilizzando il flusso di collegamento OAuth nel browser.
Se nessuna delle due condizioni è vera, crea un nuovo account utente con i dati forniti nel JWT. In genere, i nuovi account non hanno una password impostata. Ti consigliamo di aggiungere Accedi con Google ad altre piattaforme per consentire agli utenti di accedere con Google su tutte le piattaforme della tua applicazione. In alternativa, puoi inviare all'utente un'email con un link che avvia il flusso di recupero della password per consentirgli di impostare una password per accedere su altre piattaforme.
Al termine della creazione, emetti un token di accesso e restituisci i valori in un oggetto JSON nel corpo della risposta HTTPS, come nell'esempio seguente:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Recuperare l'ID client API di Google
Durante la procedura di registrazione del collegamento dell'account, ti verrà chiesto di fornire l'ID client API di Google.
Per recuperare l'ID client API utilizzando il progetto creato durante il completamento dei passaggi di collegamento OAuth: Per farlo, segui questa procedura.
- Vai alla pagina Client.
Crea o seleziona un progetto API di Google.
Se il progetto non ha un ID client per il tipo di applicazione web, fai clic su Crea client per crearne uno. Assicurati di includere il dominio del tuo sito nella casella Origini JavaScript autorizzate. Quando esegui test o sviluppo locali, devi aggiungere sia
http://localhostsiahttp://localhost:<port_number>al campo Origini JavaScript autorizzate.
Convalidare l'implementazione
Puoi convalidare l'implementazione utilizzando lo strumento OAuth 2.0 Playground.
Nello strumento, segui questi passaggi:
- Fai clic su Configurazione per aprire la finestra di configurazione di OAuth 2.0.
- Nel campo Flusso OAuth, seleziona Lato client.
- Nel campo Endpoint OAuth, seleziona Personalizzato.
- Specifica l'endpoint OAuth 2.0 e l'ID client che hai assegnato a Google nei campi corrispondenti.
- Nella sezione Passaggio 1, non selezionare alcun ambito Google. Lascia invece questo campo vuoto o digita un ambito valido per il tuo server (o una stringa arbitraria se non utilizzi gli ambiti OAuth). Quando hai finito, fai clic su Autorizza API.
- Nelle sezioni Passaggio 2 e Passaggio 3, segui il flusso OAuth 2.0 e verifica che ogni passaggio funzioni come previsto.
Puoi convalidare l'implementazione utilizzando lo strumento Demo di collegamento dell'Account Google.
Nello strumento, segui questi passaggi:
- Fai clic sul pulsante Accedi con Google.
- Scegli l'account che vuoi collegare.
- Inserisci l'ID servizio.
- (Facoltativo) Inserisci uno o più ambiti per i quali richiederai l'accesso.
- Fai clic su Avvia demo.
- Quando richiesto, conferma che puoi dare il consenso e rifiutare la richiesta di collegamento.
- Verifica di essere reindirizzato alla tua piattaforma.