Il tipo di collegamento "semplificato" di Accedi con Google basato su OAuth aggiunge Accedi con Google in aggiunta al collegamento dell'account basato su OAuth. In questo modo, gli utenti Google possono collegare facilmente i propri account tramite comandi vocali, mentre gli utenti che si sono registrati al tuo servizio con un'identità non Google possono collegare i propri account.
Questo tipo di collegamento inizia con Accedi con Google, che ti consente di verificare se le informazioni del profilo Google dell'utente esistono nel tuo sistema. Se le informazioni dell'utente non vengono trovate nel tuo sistema, inizia un flusso OAuth standard. L'utente può anche scegliere di creare un nuovo account con le informazioni del suo profilo Google.
Per eseguire il collegamento degli account con il tipo di collegamento semplificato, segui questi passaggi generali:
- Per prima cosa, chiedi all'utente di dare il consenso per accedere al suo profilo Google.
- Utilizza le informazioni nel profilo per identificare l'utente.
- Se non riesci a trovare una corrispondenza per l'utente Google nel tuo sistema di autenticazione,
il flusso procede a seconda che tu abbia configurato il tuo progetto Azioni
nella console Azioni per consentire la creazione di account utente tramite voce o solo sul
tuo sito web.
- Se consenti la creazione di account tramite comandi vocali, convalida il token ID ricevuto da Google. Puoi quindi creare un utente in base alle informazioni del profilo contenute nel token ID.
- Se non consenti la creazione di account tramite la voce, l'utente viene trasferito a un browser in cui può caricare la tua pagina di autorizzazione e completare il flusso di creazione dell'utente.
Supportare la creazione di account tramite voce
Se consenti la creazione di account utente tramite comandi vocali, l'assistente chiede all'utente se vuole fare quanto segue:
- Crea un nuovo account sul tuo sistema utilizzando le informazioni del suo Account Google oppure
- Accedi al tuo sistema di autenticazione con un altro account se hai un account non Google esistente.
La creazione dell'account tramite comandi vocali è consigliata se vuoi ridurre al minimo l'attrito del flusso di creazione dell'account. L'utente deve uscire dal flusso vocale solo se vuole accedere utilizzando un account non Google esistente.
Non consentire la creazione di account tramite comandi vocali
Se non hai consentito la creazione di account utente tramite la voce, l'assistente apre l'URL del sito web che hai fornito per l'autenticazione utente. Se l'interazione avviene su un dispositivo senza schermo, l'assistente indirizza l'utente a uno smartphone per continuare il flusso di collegamento dell'account.
Il divieto di creazione è consigliato se:
Non vuoi consentire agli utenti che hanno account non Google di creare un nuovo account utente e vuoi che si colleghino ai loro account utente esistenti nel tuo sistema di autenticazione. Ad esempio, se offri un programma fedeltà, potresti voler assicurarti che l'utente non perda i punti accumulati sul suo account esistente.
Devi avere il controllo completo del flusso di creazione dell'account. Ad esempio, potresti non consentire la creazione se devi mostrare i termini di servizio all'utente durante la creazione dell'account.
Implementare il collegamento "semplificato" di Accedi con Google basato su OAuth
Gli account vengono collegati con i flussi OAuth 2.0 standard di settore. Actions on Google supporta i flussi implicito e del codice di autorizzazione.
Nel flusso del codice implicito, Google apre il tuo endpoint di autorizzazione nel browser dell'utente. Dopo aver eseguito l'accesso, restituisci a Google un token di accesso di lunga durata. Questo token di accesso è ora incluso in ogni richiesta inviata dall'assistente alla tua azione.
Nel flusso del codice di autorizzazione, sono necessari due endpoint:
- L'endpoint di autorizzazione, che è responsabile della presentazione dell'interfaccia utente di accesso agli utenti che non hanno ancora eseguito l'accesso, nonché della registrazione del consenso all'accesso richiesto sotto forma di codice di autorizzazione di breve durata.
- L'endpoint token scambio, che è responsabile di due tipi di scambi:
- Scambia un codice di autorizzazione con un token di aggiornamento di lunga durata e un token di accesso di breve durata. Questo scambio avviene quando l'utente esegue il flusso di collegamento dell'account.
- Scambia un token di aggiornamento di lunga durata con un token di accesso di breve durata. Questa piattaforma di scambio avviene quando Google ha bisogno di un nuovo token di accesso perché quello scaduto.
Anche se il flusso del codice implicito è più facile da implementare, Google consiglia che i token di accesso emessi utilizzando il flusso implicito non scadano mai, perché l'uso della scadenza del token con il flusso implicito obbliga l'utente a collegare di nuovo il proprio account. Se per motivi di sicurezza è necessaria la scadenza del token, ti consigliamo di utilizzare il flusso del codice di autenticazione.
Configurare il progetto
Per configurare il progetto in modo da utilizzare il collegamento semplificato:
- Apri la console Actions e seleziona il progetto che vuoi utilizzare.
- Fai clic sulla scheda Sviluppa e scegli Collegamento dell'account.
- Attiva l'opzione accanto a Collegamento degli account.
- Nella sezione Creazione account, seleziona Sì.
In Tipo di collegamento, seleziona OAuth e accesso con Google e Implicito.
In Informazioni cliente, segui questi passaggi:
- Assegna un valore a ID client emesso da Actions on Google per identificare le richieste provenienti da Google.
- Inserisci gli URL per gli endpoint di autorizzazione e scambio di token.
Fai clic su Salva.
Implementa il server OAuth
Per supportare il flusso implicito OAuth 2.0, il servizio effettua un'autorizzazione endpoint disponibile tramite HTTPS. Questo endpoint è responsabile dell'autenticazione e ottenere il consenso degli utenti per l'accesso ai dati. Endpoint di autorizzazione presenta una UI di accesso agli utenti che non hanno ancora effettuato l'accesso e registra acconsentire all'accesso richiesto.
Se l'Azione deve chiamare una delle API autorizzate del tuo servizio, Google utilizza per ottenere l'autorizzazione degli utenti per chiamare queste API sui loro per conto tuo.
Una tipica sessione di flusso implicito OAuth 2.0 avviata da Google ha flusso seguente:
- Google apre il tuo endpoint di autorizzazione nel browser dell'utente. La l'utente accede se non l'ha già fatto e concede a Google l'autorizzazione ad accedere i propri dati con l'API, se non hanno già concesso l'autorizzazione.
- Il servizio crea un token di accesso e lo restituisce a Google reindirizzando il browser dell'utente a Google tramite il token di accesso in allegato alla richiesta.
- Google chiama le API del tuo servizio e collega il token di accesso con per ogni richiesta. Il tuo servizio verifica che il token di accesso conceda a Google l'autorizzazione ad accedere all'API e quindi completa la chiamata API.
Gestire le richieste di autorizzazione
Se l'azione deve eseguire il collegamento dell'account tramite un flusso implicito OAuth 2.0, Google invia l'utente al tuo endpoint di autorizzazione con una richiesta che include i seguenti parametri:
| Parametri endpoint di autorizzazione | |
|---|---|
client_id |
L'ID client che hai assegnato a Google. |
redirect_uri |
L'URL a cui invii la risposta a questa richiesta. |
state |
Un valore di riferimento che viene restituito a Google invariato nelle URI di reindirizzamento. |
response_type |
Il tipo di valore da restituire nella risposta. Per il token OAuth 2.0 implicito,
il tipo di risposta è sempre token. |
Ad esempio, se l'endpoint di autorizzazione è disponibile all'indirizzo https://myservice.example.com/auth,
una richiesta potrebbe avere il seguente aspetto:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token
Affinché l'endpoint di autorizzazione possa gestire le richieste di accesso, segui questi passaggi:
Verifica i valori
client_ideredirect_uriper evitare di concedere l'accesso ad app client indesiderate o configurate in modo errato:- Verifica che il
client_idcorrisponda all'ID cliente che hai indicato assegnati a Google. - Verifica che l'URL specificato dal
redirect_uriha il seguente formato: YOUR_PROJECT_ID è l'ID trovato nella pagina Impostazioni progetto della console di Actions.https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
- Verifica che il
Verifica se l'utente ha eseguito l'accesso al tuo servizio. Se l'utente non ha firmato completa la procedura di accesso o registrazione al servizio.
Genera un token di accesso che Google utilizzerà per accedere alla tua API. La il token di accesso può essere qualsiasi valore di stringa, ma deve rappresentare in modo univoco l'utente e il client a cui è destinato il token e non deve essere prevedibile.
Invia una risposta HTTP che reindirizza il browser dell'utente all'URL specificato dal parametro
redirect_uri. Includi tutti i seguenti parametri nel frammento URL:access_token: il token di accesso che hai appena generatotoken_type: la stringabearerstate: il valore dello stato non modificato dell'originale richiesta Di seguito è riportato un esempio dell'URL risultante:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING
Il gestore del reindirizzamento OAuth 2.0 di Google riceverà il token di accesso e confermerà
che il valore state sia rimasto invariato. Dopo che Google ha ottenuto
di accesso al tuo servizio, Google lo collegherà alle chiamate successive
all'Azione nell'ambito di AppRequest.
Handle automatic linking
After the user gives your Action 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 user_not_found error.
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&consent_code=CONSENT_CODE&scope=SCOPES
Your token exchange endpoint must be able to handle the following parameters:
| Token endpoint parameters | |
|---|---|
grant_type |
The type of token being exchanged. For these requests, this
parameter has the value urn:ietf:params:oauth:grant-type:jwt-bearer. |
intent |
For these requests, the value of this parameter is `get`. |
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. |
consent_code |
Optional: When present, a one-time code that indicates that the user has granted consent for your Action to access the specified scopes. |
scope |
Optional: Any scopes you configured Google to request from users. |
When your token exchange endpoint receives the linking request, it should do the following:
Validate and decode the JWT assertion
You can validate and decode the JWT assertion by using a JWT-decoding library for your language. Use Google's public keys (available in JWK or PEM format) to verify the token's signature.
When decoded, the JWT assertion looks like the following example:
{ "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 "locale": "en_US" }
In addition to verifying the token's signature, verify that the assertion's issuer
(iss field) is https://accounts.google.com and that the audience (aud field)
is the client ID assigned to your Action.
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 and you can issue an access token.
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 should reply with a HTTP 401 error, that specifies error=user_not_found,
as in the following example:
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"error":"user_not_found",
}
user_not_found error, Google
calls your token exchange endpoint with the value of the intent parameter
set to create and sending an ID token that contains the user's profile information
with the request.
Handle account creation via Google Sign-In
When a user needs to create an account on your service, Google makes a
request to your token exchange endpoint that specifies
intent=create, as in the following example:
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&consent_code=CONSENT_CODE&assertion=JWT[&NEW_ACCOUNT_INFO]
The assertion parameter contains 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, which you can use
to create a new account on your service.
To respond to account creation requests, your token exchange endpoint must do the following:
Validate and decode the JWT assertion
You can validate and decode the JWT assertion by using a JWT-decoding library for your language. Use Google's public keys (available in JWK or PEM format) to verify the token's signature.
When decoded, the JWT assertion looks like the following example:
{ "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 "locale": "en_US" }
In addition to verifying the token's signature, verify that the assertion's issuer
(iss field) is https://accounts.google.com and that the audience (aud field)
is the client ID assigned to your Action.
Validate user information and create new account
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, prompt the user to link their existing account with
their Google Account by responding to the request with an HTTP 401 error, specifying
error=linking_error and the user's email address as the login_hint, as in the
following example:
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"error":"linking_error",
"login_hint":"foo@bar.com"
}
If neither condition is true, create a new user account using the information provided in the JWT. New accounts do not typically have a password set. It is recommended that you add Google Sign In to other platforms to enable users to log in via Google across the surfaces of your application. Alternatively, you can email the user a link that starts your password recovery flow to allow the user to set a password for signing in on other platforms.
When the creation is completed, 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", "expires_in": SECONDS_TO_EXPIRATION }
Progettare l'interfaccia utente vocale per il flusso di autenticazione
Verifica se l'utente è verificato e avvia il flusso di collegamento degli account
- Apri il progetto Actions Builder nella console Actions.
- Crea una nuova scena per avviare il collegamento dell'account nella tua azione:
- Fai clic su Scene.
- Fai clic sull'icona Aggiungi (+) per aggiungere una nuova scena.
- Nella scena appena creata, fai clic sull'icona Aggiungi add per Condizioni.
- Aggiungi una condizione che verifichi se l'utente associato alla conversazione è un
utente verificato. Se il controllo non va a buon fine, l'Azione non può eseguire il collegamento dell'account
durante la conversazione e deve ripiegare sull'accesso
a funzionalità che non richiedono il collegamento dell'account.
- Nel campo
Enter new expressionin Condizione, inserisci la seguente logica:user.verificationStatus != "VERIFIED" - In Transizione, seleziona una scena che non richiede il collegamento dell'account o una scena che è il punto di accesso alla funzionalità solo per gli ospiti.
- Nel campo

- Fai clic sull'icona di aggiunta add per Condizioni.
- Aggiungi una condizione per attivare un flusso di collegamento dell'account se l'utente non ha
un'identità associata.
- Nel campo
Enter new expressionin Condizione, inserisci la seguente logica:user.verificationStatus == "VERIFIED" - Nella sezione Transizione, seleziona la scena di sistema Collegamento dell'account.
- Fai clic su Salva.
- Nel campo

Dopo il salvataggio, al progetto viene aggiunta una nuova scena del sistema di collegamento degli account chiamata <SceneName>_AccountLinking.
Personalizzare la scena di collegamento degli account
- Nella sezione Scene, seleziona la scena del sistema di collegamento degli account.
- Fai clic su Invia prompt e aggiungi una breve frase per descrivere all'utente perché l'azione deve accedere alla sua identità (ad esempio "Per salvare le tue preferenze").
- Fai clic su Salva.

- In Condizioni, fai clic su Se l'utente completa correttamente il collegamento degli account.
- Configura la modalità di avanzamento del flusso se l'utente accetta di collegare il proprio account. Ad esempio, chiama il webhook per elaborare qualsiasi logica di business personalizzata richiesta e torna alla scena di origine.
- Fai clic su Salva.

- Nella sezione Condizioni, fai clic su Se l'utente annulla o ignora il collegamento all'account.
- Configura la modalità di procedere del flusso se l'utente non accetta di collegare il proprio account. Ad esempio, invia un messaggio di conferma e reindirizza alle scene che forniscono funzionalità che non richiedono il collegamento dell'account.
- Fai clic su Salva.

- Nella sezione Condizioni, fai clic su Se si verifica un errore di sistema o di rete.
- Configura la modalità di procedere del flusso se il flusso di collegamento dell'account non può essere completato a causa di errori di sistema o di rete. Ad esempio, invia un messaggio di conferma e reindirizza alle scene che forniscono funzionalità che non richiedono il collegamento dell'account.
- Fai clic su Salva.
Gestire le richieste di accesso ai dati
Se la richiesta dell'assistente contiene un token di accesso, verifica prima che il token di accesso sia valido e non scaduto, poi recupera dal tuo database degli account utente l'account utente associato al token.