Collegamento dell'account con il collegamento "semplificato" di Accedi con Google basato su OAuth

Il tipo di collegamento "Semplificato" Accedi con Google basato su OAuth aggiunge Accedi con Google oltre al collegamento degli account basato su OAuth. In questo modo, gli utenti Google possono creare un collegamento diretto tramite comandi vocali, nonché abilitare il collegamento degli account per gli utenti che si sono registrati al tuo servizio con un'identità non Google.

Questo tipo di collegamento inizia con Accedi con Google, che consente di verificare se le informazioni del profilo Google dell'utente sono presenti nel sistema. Se le informazioni dell'utente non vengono trovate nel sistema, viene avviato un flusso OAuth standard. L'utente può anche scegliere di creare un nuovo account con le informazioni del proprio profilo Google.

Figura 1: dopo che l'Azione ha ottenuto l'accesso al profilo Google dell'utente, puoi utilizzarla per trovare una corrispondenza per l'utente nel tuo sistema di autenticazione.

Per eseguire il collegamento dell'account con il tipo di collegamento semplificato, segui questi passaggi generali:

  1. Innanzitutto, chiedi all'utente di dare il consenso ad accedere al proprio profilo Google.
  2. Utilizza le informazioni del profilo per identificare l'utente.
  3. 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 progetto Actions nella console di Actions per consentire la creazione di account utente tramite comandi vocali 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 comandi vocali, l'utente viene trasferito a un browser in cui può caricare la pagina di autorizzazione e completare il flusso di creazione dell'utente.
Se consenti la creazione dell'account tramite comandi vocali e non riesci a trovare una corrispondenza per il profilo Google nel tuo sistema di autenticazione, devi convalidare 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 utente tramite comandi vocali, l'utente viene
            trasferito in un browser dove può caricare la tua pagina di autorizzazione
            e completare il flusso.
Figura 2. Una rappresentazione visiva del flusso OAuth e Accedi con Google quando le informazioni di un utente non vengono trovate nel sistema.

Supporta la creazione di account tramite comandi vocali

Se consenti la creazione di account utente tramite comandi vocali, l'assistente chiede all'utente se vuole:

  • Creare un nuovo account sul tuo sistema utilizzando i dati del suo account Google oppure
  • Accedi al tuo sistema di autenticazione con un altro account se dispongono già di un account non Google.

Per ridurre al minimo l'attrito del flusso di creazione degli account, ti consigliamo di consentire la creazione di account tramite comandi vocali. L'utente deve abbandonare il 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 comandi vocali, l'assistente apre l'URL che rimanda al sito web che hai fornito per l'autenticazione utente. Se l'interazione avviene su un dispositivo senza schermo, l'assistente indirizza l'utente a un telefono per continuare la procedura di collegamento dell'account.

Ti consigliamo di non consentire la creazione se:

  • Non vuoi consentire agli utenti con 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à, ti consigliamo di 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 consentire la creazione se devi mostrare i tuoi Termini di servizio all'utente durante la creazione dell'account.

Implementare il collegamento "Semplificato" di Accedi con Google basato su OAuth

Gli account sono collegati a flussi OAuth 2.0 standard di settore. Actions on Google supporta i flussi implicito e del codice di autorizzazione.

In the implicit code flow, Google opens your authorization endpoint in the user's browser. After successful sign in, you return a long-lived access token to Google. This access token is now included in every request sent from the Assistant to your Action.

In the authorization code flow, you need two endpoints:

  • The authorization endpoint, which is responsible for presenting the sign-in UI to your users that aren't already signed in and recording consent to the requested access in the form of a short-lived authorization code.
  • The token exchange endpoint, which is responsible for two types of exchanges:
    1. Exchanges an authorization code for a long-lived refresh token and a short-lived access token. This exchange happens when the user goes through the account linking flow.
    2. Exchanges a long-lived refresh token for a short-lived access token. This exchange happens when Google needs a new access token because the one it had expired.

Although the implicit code flow is simpler to implement, Google recommends that access tokens issued using the implicit flow never expire, because using token expiration with the implicit flow forces the user to link their account again. If you need token expiration for security reasons, you should strongly consider using the auth code flow instead.

Configura il progetto

Per configurare il tuo progetto per l'utilizzo del collegamento semplificato, segui questi passaggi:

  1. Apri la console di Actions e seleziona il progetto che vuoi utilizzare.
  2. Fai clic sulla scheda Sviluppo e scegli Collegamento dell'account.
  3. Attiva l'opzione Collegamento dell'account.
  4. Nella sezione Creazione account, seleziona .

  5. In Tipo di collegamento, seleziona Accesso OAuth e Google e Implicito.

  6. In Informazioni sul cliente, procedi nel seguente modo:

    • Assegna un valore al Client-ID emesso dalle tue Azioni a Google per identificare le richieste provenienti da Google.
    • Inserisci gli URL per gli endpoint di autorizzazione e di scambio dei token.
  7. Fai clic su Salva.

Implementare il server OAuth

Per supportare il flusso implicito OAuth 2.0, il 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'UI di accesso agli utenti che non hanno ancora effettuato l'accesso e registra il consenso all'accesso richiesto.

Quando l'Azione 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.

Una tipica sessione di flusso implicito OAuth 2.0 avviata da Google prevede il seguente flusso:

  1. Google apre il tuo endpoint di autorizzazione nel browser dell'utente. L'utente esegue l'accesso se non ha già effettuato l'accesso e concede a Google l'autorizzazione ad accedere ai suoi dati con la tua API, se non l'ha già fatto.
  2. Il servizio crea un token di accesso e lo restituisce a Google reindirizzando il browser dell'utente a Google con il token di accesso allegato alla richiesta.
  3. Google chiama le API del tuo servizio e allega il token di accesso a ogni richiesta. Il servizio verifica che il token di accesso conceda a Google l'autorizzazione ad accedere all'API, quindi completa la chiamata API.

Gestire le richieste di autorizzazione

Quando l'Azione deve eseguire il collegamento dell'account tramite un flusso implicito OAuth 2.0, Google invia l'utente all'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 contabile che viene restituito a Google e invariato nell'URI di reindirizzamento.
response_type Il tipo di valore da restituire nella risposta. Per il flusso implicito OAuth 2.0, il tipo di risposta è sempre token.

Ad esempio, se il tuo endpoint di autorizzazione è disponibile all'indirizzo https://myservice.example.com/auth, una richiesta potrebbe essere simile a:

GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token

Affinché il tuo endpoint di autorizzazione possa gestire le richieste di accesso:

  1. Verifica i valori client_id e redirect_uri per impedire di concedere l'accesso ad app client indesiderate o configurate in modo errato:

    • Verifica che client_id corrisponda all'ID client assegnato a Google.
    • Verifica che l'URL specificato dal parametro redirect_uri abbia il formato seguente:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      YOUR_PROJECT_ID è l'ID che si trova nella pagina Impostazioni progetto di Actions Console.
  2. Controlla se l'utente ha eseguito l'accesso al servizio. Se l'utente non ha eseguito l'accesso, completa il flusso di accesso o registrazione al servizio.

  3. Genera un token di accesso che Google utilizzerà per accedere alla tua API. Il token di accesso può essere qualsiasi valore stringa, ma deve rappresentare in modo univoco l'utente e il client a cui si riferisce il token e non deve essere intuibile.

  4. Invia una risposta HTTP che reindirizza il browser dell'utente all'URL specificato dal parametro redirect_uri. Includi tutti i seguenti parametri nel frammento di URL:

    • access_token: il token di accesso appena generato
    • token_type: la stringa bearer
    • state: il valore dello stato non modificato della richiesta originale 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 non è cambiato. Dopo che Google avrà ottenuto un token di accesso per il tuo servizio, lo associa alle chiamate successive all'Azione nell'ambito di AppRequest.

处理自动关联

用户同意您的 Action 访问其 Google 个人资料后,Google 会发送一个请求,其中包含已签署的 Google 用户身份断言。该断言包含用户的 Google 帐号 ID、姓名和电子邮件地址等信息。您为项目配置的令牌交换端点会处理该请求。

如果您的身份验证系统中已存在相应的 Google 帐号,则令牌交换端点为用户返回一个令牌。如果 Google 帐号与现有用户不匹配,则令牌交换端点会返回 user_not_found 错误。

该请求的格式如下:

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

您的令牌交换端点必须能够处理以下参数:

令牌端点参数
grant_type 要交换的令牌的类型。对于这些请求,此参数的值为 urn:ietf:params:oauth:grant-type:jwt-bearer
intent 对于这些请求,此参数的值为 `get`。
assertion 一个 JSON Web 令牌 (JWT),可提供 Google 用户身份的已签名断言。JWT 包含用户的 Google 帐号 ID、名称和电子邮件地址等信息。
consent_code 可选:如果存在,这是一个一次性代码,用于表明用户已同意您的 Action 访问指定范围。
scope 可选:您已配置 Google 向用户请求的任何范围。

当您的令牌交换端点收到关联请求时,应执行以下操作:

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 in formato JWK o PEM) per verificare la firma del token.

Una volta decodificata, l'asserzione JWT è simile al seguente esempio:

{
  "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"
}

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

检查您的身份验证系统中是否已经存在相关 Google 账号

检查是否满足以下任一条件:

  • Google 帐号 ID(可在断言的 sub 字段中找到)位于您的用户数据库中。
  • 断言中的电子邮件地址与用户数据库中的用户匹配。

如果满足任一条件,则表示用户已完成注册,您可以颁发访问令牌。

如果 Google 帐号 ID 和断言中指定的电子邮件地址均与您数据库中的用户不匹配,则表示该用户尚未注册。在这种情况下,您的令牌交换端点应回复 HTTP 401 错误,该错误会指定 error=user_not_found,如以下示例所示:

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"user_not_found",
}
当 Google 收到包含 user_not_found 错误的 401 错误响应时,Google 会调用您的令牌交换端点,将 intent 参数的值设为 create,并通过请求发送一个包含用户个人资料信息的 ID 令牌。

Gestire la creazione di account tramite Accedi con Google

Quando un utente deve creare un account nel tuo servizio, Google effettua una richiesta all'endpoint di scambio di token che specifica intent=create, come nell'esempio seguente:

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]

Il parametro assertion contiene un token JWT (JSON Web Token) che fornisce un'asserzione firmata dell'identità dell'utente Google. Il JWT contiene informazioni che includono l'ID, il nome e l'indirizzo email dell'Account Google dell'utente, che puoi utilizzare per creare un nuovo account nel tuo servizio.

Per rispondere alle richieste di creazione di account, l'endpoint di scambio di token deve:

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 in formato JWK o PEM) per verificare la firma del token.

Una volta decodificata, l'asserzione JWT è simile al seguente esempio:

{
  "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"
}

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

Convalida le informazioni degli utenti e crea un nuovo account

Controlla se una delle seguenti condizioni è vera:

  • L'ID Account Google, indicato nel campo sub dell'asserzione, si trova nel tuo database utenti.
  • L'indirizzo e-mail nell'asserzione corrisponde a un utente nel tuo database utenti.

Se una delle condizioni è vera, chiedi all'utente di collegare l'account esistente al proprio Account Google rispondendo alla richiesta con un errore HTTP 401, specificando error=linking_error e l'indirizzo email dell'utente come login_hint, come nell'esempio seguente:

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"linking_error",
  "login_hint":"foo@bar.com"
}

Se nessuna delle due condizioni è vera, crea un nuovo account utente utilizzando le informazioni fornite nel JWT. In genere, per i nuovi account non è impostata una password. Ti consigliamo di aggiungere Accedi con Google ad altre piattaforme per consentire agli utenti di accedere tramite Google su tutte le piattaforme della tua applicazione. In alternativa, puoi inviare all'utente un'email con un link che avvia la procedura di recupero della password per permettergli di impostare una password per l'accesso 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",
  
  "expires_in": SECONDS_TO_EXPIRATION
}

Progetta l'interfaccia utente vocale per il flusso di autenticazione

Controlla se l'utente è verificato e avvia la procedura di collegamento dell'account

  1. Apri il progetto Actions Builder nella console di Actions.
  2. Crea una nuova scena per avviare il collegamento dell'account nell'Azione:
    1. Fai clic su Scene.
    2. Fai clic sull'icona Aggiungi (+) per aggiungere una nuova scena.
  3. Nella scena appena creata, fai clic sull'icona Aggiungi in Condizioni.
  4. Aggiungi una condizione che verifichi se l'utente associato alla conversazione è un utente verificato. Se il controllo ha esito negativo, l'Azione non può eseguire il collegamento dell'account durante la conversazione e dovrebbe fornire l'accesso a funzionalità che non richiedono il collegamento dell'account.
    1. Nel campo Enter new expression in Condizione, inserisci la seguente logica: user.verificationStatus != "VERIFIED"
    2. In Transizione, seleziona una scena che non richieda il collegamento dell'account o che sia il punto di accesso alle funzionalità solo per gli ospiti.

  1. Fai clic sull'icona Aggiungi in Condizioni.
  2. Aggiungi una condizione per attivare un flusso di collegamento dell'account se all'utente non è associata un'identità.
    1. Nel campo Enter new expression in Condizione, inserisci la seguente logica: user.verificationStatus == "VERIFIED"
    2. In Transizione, seleziona la scena di sistema Collegamento dell'account.
    3. Fai clic su Salva.

Dopo il salvataggio, al progetto viene aggiunta una nuova scena di sistema di collegamento dell'account denominata <SceneName>_AccountLinking.

Personalizzare la scena di collegamento dell'account

  1. In Scene, seleziona la scena di sistema per il collegamento dell'account.
  2. Fai clic su Invia richiesta e aggiungi una breve frase per descrivere all'utente il motivo per cui l'Azione deve accedere alla sua identità (ad esempio "Per salvare le tue preferenze").
  3. Fai clic su Salva.

  1. In Condizioni, fai clic su Se l'utente completa correttamente il collegamento dell'account.
  2. Configura la procedura da seguire nel caso in cui l'utente accetti di collegare il suo account. Ad esempio, chiama il webhook per elaborare qualsiasi logica di business personalizzata richiesta e tornare alla scena di origine.
  3. Fai clic su Salva.

  1. In Condizioni, fai clic su Se l'utente annulla o ignora il collegamento dell'account.
  2. Configura la procedura da seguire nel flusso se l'utente non accetta di collegare il proprio account. Ad esempio, invia un messaggio di conferma e reindirizza a scene che offrono funzionalità che non richiedono il collegamento dell'account.
  3. Fai clic su Salva.

  1. In Condizioni, fai clic su Se si verifica un errore di sistema o di rete.
  2. Configura la procedura da seguire se non è possibile completare il flusso di collegamento dell'account a causa di errori di sistema o di rete. Ad esempio, invia un messaggio di conferma e reindirizza a scene che offrono funzionalità che non richiedono il collegamento dell'account.
  3. Fai clic su Salva.

Gestire le richieste di accesso ai dati

Se la richiesta dell'assistente contiene un token di accesso, verifica che il token di accesso sia valido e che non sia scaduto, quindi recupera dal database degli account utente l'account utente associato al token.