Collegamento dell'account con OAuth e Accedi con Google (Dialogflow)

Il tipo di collegamento OAuth e Accedi con Google aggiunge Accedi con Google oltre alle impostazioni basate su OAuth collegamento dell'account. In questo modo, gli utenti Google possono collegarsi tramite comandi vocali e 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 ti consente di verificare se l'utente Nel sistema sono presenti informazioni del profilo Google. Se le informazioni dell'utente non è presente nel sistema, viene avviato un flusso OAuth standard. L'utente può inoltre sceglie di creare un nuovo account con i dati del proprio profilo Google.

Figura 1: dopo che l'azione ha ottenuto l'accesso all'account Google puoi utilizzarlo per trovare una corrispondenza per l'utente nel tuo sistema di autenticazione.

Per eseguire il collegamento dell'account con OAuth e Accedi con Google, segui queste informazioni generali passaggi:

  1. Per prima cosa, chiedi all'utente di dare il consenso per accedere al suo profilo Google.
  2. Utilizza le informazioni presenti nel 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 o meno il progetto Actions Nella console di Actions per consentire la creazione di account utente tramite comandi vocali o solo del tuo sito web.
    • Se consenti la creazione di account tramite comandi vocali, convalida l'ID di accesso al token ricevuto da Google. Puoi quindi creare un utente in base le 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 possano caricare la pagina di autorizzazione e completare la procedura flusso di creazione di contenuti.
di Gemini Advanced.
Se consenti la creazione di un account tramite comandi vocali e non riesci a trovare una corrispondenza per
            profilo Google nel sistema di autenticazione, devi
            convalidare il token ID ricevuto da Google. Puoi quindi creare un
            in base alle informazioni del profilo contenute nel token ID.
            Se non consenti la creazione di account utente tramite comandi vocali, l'utente:
            trasferiti a un browser dove possono caricare la pagina di autorizzazione
            e completare la procedura.
Figura 2. Una rappresentazione visiva di OAuth e Google Flusso di accesso quando le informazioni di un utente non vengono trovate nel sistema.

Assistenza per la creazione di account tramite comandi vocali

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

  • Creare un nuovo account sul tuo sistema utilizzando i dati del loro Account Google oppure
  • Accedere al sistema di autenticazione con un account diverso, se dispone di un account non Google esistente.

Ti consigliamo di consentire la creazione di account tramite comandi vocali se vuoi ridurre al minimo le le difficoltà del flusso di creazione dell'account. L'utente deve solo uscire dal flusso vocale se l'utente vuole accedere utilizzando un account non Google esistente.

Non consentire la creazione di account tramite comandi vocali

Se non consenti la creazione di account utente tramite comandi vocali, l'assistente apre l'URL nella sezione fornito per l'autenticazione degli utenti. Se l'interazione è in corso su un dispositivo privo di schermo, l'assistente indirizza l'utente a un telefono per continuare il flusso di collegamento dell'account.

Si consiglia di non consentire la creazione 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 basato su query. Ad esempio, se offri un programma fedeltà, potresti voler assicurarti che l'utente non perda i punti accumulati sulla sua account esistente.

  • Devi avere il controllo completo del flusso di creazione dell'account. Ad esempio, potresti non consentire la creazione se devi mostrare i tuoi Termini di servizio all'utente durante creazione di account.

di Gemini Advanced.

Implementare il collegamento degli account OAuth e Accedi con Google

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

在隐式代码流程中,Google 会在用户浏览器中打开您的授权端点。成功登录后,系统会向 Google 返回长期访问令牌。现在,从 Google 助理向你的 Action 发送的每个请求中都包含此访问令牌。

在授权代码流程中,您需要两个端点:

  • 授权端点,该端点负责向尚未登录的用户显示登录界面,并以短期授权代码的形式记录所请求的访问。
  • 令牌交换端点,负责两种类型的交换:
    1. 将授权代码交换为长期刷新令牌和短期访问令牌。用户完成帐号关联流程后,系统会进行这种交换。
    2. 将长期刷新令牌换成短期访问令牌。Google 需要新访问令牌时,由于此令牌已过期,因此会进行此交换。

虽然隐式代码流程的实现更简单,但 Google 建议通过隐式流程发出的访问令牌永远不会过期,因为将令牌过期与隐式流程一起使用会强制用户再次关联其帐号。如果出于安全考虑需要令牌到期,强烈建议您考虑使用身份验证代码流程。

Configura il progetto

Per configurare il progetto in modo che utilizzi OAuth e l'account Accedi con Google 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 dell'account, seleziona .

  5. In Tipo di collegamento, seleziona OAuth e Accedi con Google e implicito.

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

    • Assegna un valore all'ID client emesso dalle tue Azioni a Google per identificare da Google.
    • Inserisci gli URL degli endpoint di autorizzazione e di scambio di token.
  7. Fai clic su Salva.

Implementare 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:

  1. 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.
  2. 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.
  3. 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 OAuth2, 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:

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

    • Verifica che il client_id corrisponda all'ID cliente che hai indicato assegnati a Google.
    • Verifica che l'URL specificato dal redirect_uri ha il seguente formato:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      YOUR_PROJECT_ID è l'ID trovato nella pagina Impostazioni progetto della console di Actions.
  2. 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.

  3. 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.

  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 URL:

    • access_token: il token di accesso che hai appena generato
    • token_type: la stringa bearer
    • state: 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.

处理自动关联

在用户同意你的 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 包含的信息包括 账号 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 il tuo linguaggio. Utilizza le chiavi pubbliche di Google (disponibili in JWK o PEM) per verificare il token firma.

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
  "locale": "en_US"
}

Oltre a verificare la firma del token, verifica che l'emittente dell'asserzione (campo iss) è https://accounts.google.com e che il segmento di pubblico (campo aud) è 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 错误响应时, 使用 intent 参数的值调用您的令牌交换端点 设置为 create 并发送包含用户个人资料信息的 ID 令牌 一起发送。

通过 Google 登录功能处理账号创建

当用户需要在您的服务中创建账号时,Google 会 向令牌交换端点发送的请求 intent=create,如以下示例所示:

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]

assertion 参数包含 JSON Web 令牌 (JWT),可提供 Google 用户的身份的已签名断言。JWT 包含 其中包含用户的 Google 账号 ID、姓名和电子邮件地址 为您的服务创建一个新账号。

如需响应账号创建请求,您的令牌交换端点必须执行以下操作 以下:

convalida e decodifica l'asserzione JWT

Puoi convalidare e decodificare l'asserzione JWT utilizzando una libreria di decodifica JWT per il tuo linguaggio. Utilizza le chiavi pubbliche di Google (disponibili in JWK o PEM) per verificare il token firma.

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
  "locale": "en_US"
}

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

验证用户信息并创建新账号

请检查以下任一条件是否成立:

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

如果满足上述任一条件,则提示用户将其现有账号关联 通过使用 HTTP 401 错误响应请求 error=linking_error,并将用户的电子邮件地址为 login_hint,如 示例:

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

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

如果以上两个条件都不满足,请使用相应信息创建一个新的用户账号 。新账号通常不会设置密码。时间是 建议您将 Google 登录功能添加到其他平台,以便用户能够 在您的应用的各个界面上通过 Google 投放广告。或者,您也可以 通过电子邮件向用户发送链接,启动密码恢复流程,以便用户设置 密码,以便在其他平台上登录。

创建完成后,发出一个访问令牌 并在 HTTPS 响应的正文,如以下示例所示:

{
  "token_type": "Bearer",
  "access_token": "ACCESS_TOKEN",
  
  "expires_in": SECONDS_TO_EXPIRATION
}

Avvia il flusso di autenticazione

Utilizzare l'intent di supporto per l'accesso all'account per avviare il flusso di autenticazione.

Dialogflow (Node.js)
const app = dialogflow({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
})

// Intent that starts the account linking flow.
app.intent('Start Signin', conv => {
  conv.ask(new SignIn('To get your account details'))
})
Dialogflow (Java)
private String clientId = "<your_client_id>";

@ForIntent("Start Signin")
public ActionResponse text(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  return rb.add(new SignIn().setContext("To get your account details")).build();
}
SDK Actions (Node.js)
const app = actionssdk({
  clientId: CLIENT_ID,
})

app.intent('Start Signin', conv => {
  conv.ask(new SignIn('To get your account details'))
})
SDK Actions (Java)
private String clientId = "<your_client_id>";

@ForIntent("actions.intent.TEXT")
public ActionResponse text(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  return rb.add(new SignIn().setContext("To get your account details")).build();
}

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 non scaduto, quindi recuperalo dal tuo l'account utente associato al token.