O tipo vinculação do OAuth é compatível com dois fluxos padrão do setor do OAuth 2.0: os fluxos de código implícito e de autorização.
No fluxo de código implícito, o Google abre o endpoint de autorização no navegador do usuário. Após o login, você retorna um token de acesso de longa duração para o Google. Esse token de acesso agora está incluído em todas as solicitações enviadas do Assistente para sua ação.
No fluxo do código de autorização, você precisa de dois endpoints:
- O endpoint de autorização, responsável por apresentar a IU de login aos usuários que ainda não fizeram login e registrar o consentimento para o acesso solicitado na forma de um código de autorização de curta duração.
- O endpoint de troca de token, que é responsável por dois tipos de trocas:
- troca um código de autorização por um token de atualização de longa duração e um token de acesso de curta duração. Essa troca acontece quando o usuário passa pelo fluxo de vinculação da conta.
- Troca um token de atualização de longa duração por um token de acesso de curta duração. Essa troca acontece quando o Google precisa de um novo token de acesso porque ele expirou.
Embora o fluxo do código implícito seja mais simples de implementar, o Google recomenda que os tokens de acesso emitidos usando o fluxo implícito nunca expirem, porque o uso do token com o fluxo implícito força o usuário a vincular a conta novamente. Se você precisar da validade do token por motivos de segurança, considere o uso do fluxo do código de autenticação.
Implementar a vinculação de contas OAuth
Configurar o projeto
Para configurar seu projeto para usar a vinculação do OAuth, siga estas etapas:
- Abra o Actions Console e selecione o projeto que você quer usar.
- Clique na guia Desenvolver e escolha Vinculação de contas.
- Ative a chave ao lado de Vinculação de contas.
- Na seção Criação de conta, selecione Não, quero permitir a criação de contas apenas no meu site.
Em Tipo de vinculação, selecione OAuth e Código de autorização.
Em Informações do cliente:
- Atribua um valor a ID do cliente emitido pelo Actions on Google para identificar solicitações do Google.
- Anote o valor do ID do cliente emitido pelo Google para suas ações.
- Insira os URLs dos endpoints de autorização e troca de token.
- Clique em Salvar.
Implementar seu servidor OAuth
授权代码流程的 OAuth 2.0 服务器实现包括 两个端点,您的服务会通过 HTTPS 提供这两个端点。第一个端点 是授权端点,负责查找或获取 就数据访问征求用户意见。授权端点显示登录 尚未登录的用户的界面,并记录同意 请求的访问权限。第二个端点是令牌交换端点, 用于获取名为令牌(用于向 Action 用户授权)的加密字符串 以访问您的服务。
当您的 Action 需要调用您的某项服务的 API 时,Google 会使用这些 API 端点一起获取用户许可,以便在他们的 。
Google 发起的 OAuth 2.0 身份验证代码流程会话包含以下流程:
- Google 会在用户的浏览器中打开您的授权端点。如果流 用户通过纯语音设备启动 Action,Google 会将 将代码执行到手机上
用户登录(如果尚未登录)并授予 Google 以下权限: 通过您的 API 访问其数据。
您的服务会创建授权代码,并通过以下方式返回给 Google: 使用授权代码将用户的浏览器重定向回 Google 附件。
Google 会将授权代码发送到您的令牌交换端点, 验证代码的真实性并返回访问令牌和 刷新令牌。访问令牌是一个短期有效的令牌 作为访问 API 的凭据。刷新令牌长期有效 Google 可以存储该令牌,以便在用户首次访问该令牌时, 过期。
在用户完成账号关联流程后, 从 Google 助理发送到您的 fulfillment webhook 的请求包含 访问令牌。
处理授权请求
当您的 Action 需要通过 OAuth 2.0 授权代码执行账号关联时 流程中,Google 会通过请求将用户发送到您的授权端点 包含以下参数:
授权端点参数 | |
---|---|
client_id |
您在 Google 注册的 Google 客户端 ID。 |
redirect_uri |
此请求的响应发送到的网址。 |
state |
将一个在 重定向 URI。 |
scope |
可选:一组以空格分隔的范围字符串,用于指定 Google 请求授权的数据 |
response_type |
字符串 code 。 |
例如,如果您的授权端点可通过 https://myservice.example.com/auth
访问,
请求可能如下所示:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code
为了让授权端点能够处理登录请求,请执行以下步骤:
验证
client_id
与您注册的 Google 客户端 ID 是否一致 并且redirect_uri
与 Google 提供的重定向网址相匹配 。这些检查对于防止向 意外或配置错误的客户端应用如果您支持多个 OAuth 2.0 流程,也请确认
response_type
为code
。检查用户是否已登录您的服务。如果用户没有登录, 完成服务的登录或注册流程。
生成 Google 将用于访问您的 API 的授权代码。 授权代码可以是任何字符串值,但它必须是唯一的 代表用户、令牌对应的客户端以及代码的有效期 而且不可猜测出来。您通常需要进行授权 会在大约 10 分钟后过期。
确认
redirect_uri
参数指定的网址 采用以下格式: YOUR_PROJECT_ID 是项目设置页面上的 ID Actions 控制台界面。https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
将用户的浏览器重定向到
redirect_uri
参数。添加您在 以及您在重定向时返回未经修改的原始状态值 方法是附加code
和state
参数。下面是一个示例 结果网址:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING
处理令牌交换请求
您的服务的令牌交换端点负责处理两种令牌 广告交易平台:
- 交换访问令牌和刷新令牌的授权代码
- 用刷新令牌换取访问令牌
令牌交换请求包含以下参数:
令牌交换端点参数 | |
---|---|
client_id |
用于将请求来源标识为 Google 的字符串。此字符串必须 在您的系统中注册为 Google 的唯一标识符。 |
client_secret |
您在 Google 中为您的服务注册的密钥字符串。 |
grant_type |
所交换的令牌的类型。两者之一
authorization_code 或 refresh_token 。 |
code |
当 grant_type=authorization_code 时,代码 Google
从您的登录端点或令牌交换端点接收验证码。 |
redirect_uri |
如果值为 grant_type=authorization_code ,则此参数为
初始授权请求中使用的网址。 |
refresh_token |
如果值为 grant_type=refresh_token ,则刷新令牌 Google
从令牌交换端点接收的令牌 |
交换访问令牌和刷新令牌的授权代码
用户登录且您的授权端点返回短期授权后 代码,Google 就会向您的令牌交换端点发送请求, 访问令牌和刷新令牌的授权码。
对于这些请求,grant_type
的值为 authorization_code
,值
code
是您先前向 Google 授予的授权代码的值。
以下是使用授权代码交换
访问令牌和刷新令牌:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI
要将授权代码交换为访问令牌和刷新令牌,您的
令牌交换端点响应执行以下步骤的 POST
请求:
- 验证
client_id
是否将请求来源标识为已获授权的来源。 并且client_secret
与预期值匹配。 - 请验证以下内容:
<ph type="x-smartling-placeholder">
- </ph>
- 授权代码有效且未过期,且客户端 请求中指定的 ID 与 授权代码。
redirect_uri
参数指定的网址完全相同 初始授权请求中使用的值。
- 如果您无法验证上述所有条件,则返回 HTTP
正文为
{"error": "invalid_grant"}
的 400 Bad Request 错误。 - 否则,使用授权代码中的用户 ID 生成刷新 令牌和访问令牌。这些标记可以是任何字符串值,但它们必须 唯一代表令牌的用户和客户端,不得 更容易被猜到。对于访问令牌,请记录令牌的到期时间 (通常在您发放令牌一小时后)。刷新令牌不会过期。
- 在 HTTPS 响应的正文中返回以下 JSON 对象:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Google 会存储用户的访问令牌和刷新令牌,并记录 访问令牌的过期日期。访问令牌过期后,Google 会使用刷新 令牌,从令牌交换端点获取新的访问令牌。
用刷新令牌换取访问令牌
访问令牌过期后,Google 会向您的令牌交换端点发送请求 将刷新令牌交换为新的访问令牌。
对于这些请求,grant_type
的值为 refresh_token
,值
refresh_token
是您之前授予 Google 的刷新令牌的值。
以下是用刷新令牌交换
访问令牌:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
如需将刷新令牌交换为访问令牌,令牌交换端点
对执行以下步骤的 POST
请求做出响应:
- 验证
client_id
是否将请求来源标识为 并且client_secret
与预期 值。 - 请确认刷新令牌有效,以及在 请求与刷新令牌所关联的客户端 ID 相匹配。
- 如果您无法验证上述所有条件,则返回 HTTP
正文为
{"error": "invalid_grant"}
的 400 Bad Request 错误。 - 否则,请使用刷新令牌中的用户 ID 来生成访问权限 令牌。这些标记可以是任何字符串值,但它们必须唯一地表示 令牌对应的用户和客户端,并且不得被猜到。 对于访问令牌,请记录令牌的到期时间 (通常在您发放令牌一小时后)。
- 在 HTTPS 的正文中返回以下 JSON 对象
回答:
{ "token_type": "不记名", "access_token": "ACCESS_TOKEN", “expires_in”:SECONDS_TO_EXPIRATION }
Projetar a interface de usuário de voz para o fluxo de autenticação
Verificar se o usuário está verificado e iniciar o fluxo de vinculação da conta
- Abra seu projeto do Actions Builder no Console do Actions.
- Crie uma nova cena para iniciar a vinculação de contas na sua ação:
- Clique em Cenas.
- Clique no ícone de adição (+) para adicionar uma nova cena.
- Na cena recém-criada, clique no ícone de adição add para Condições.
- Adicione uma condição que verifique se o usuário associado à conversa é um usuário verificado. Se a verificação falhar, a Ação não poderá vincular contas
durante a conversa e precisará oferecer acesso a
funcionalidades que não exigem vinculação de contas.
- No campo
Enter new expression
em Condição, insira a seguinte lógica:user.verificationStatus != "VERIFIED"
- Em Transição, selecione uma cena que não exija vinculação de conta ou uma cena que seja o ponto de entrada para a funcionalidade somente para convidados.
- No campo
- Clique no ícone de adição add em Condições.
- Adicione uma condição para acionar um fluxo de vinculação de contas se o usuário não tiver
uma identidade associada.
- No campo
Enter new expression
em Condição, insira a seguinte lógica:user.verificationStatus == "VERIFIED"
- Em Transição, selecione a cena do sistema Vinculação de conta.
- Clique em Salvar.
- No campo
Depois de salvar, uma nova cena do sistema de vinculação de contas chamada <SceneName>_AccountLinking
será adicionada ao seu projeto.
Personalizar a cena de vinculação de conta
- Em Cenas, selecione a cena do sistema de vinculação de contas.
- Clique em Enviar solicitação e adicione uma frase curta para descrever ao usuário por que a ação precisa acessar a identidade dele (por exemplo, "Para salvar suas preferências").
- Clique em Salvar.
- Em Condições, clique em Se o usuário concluir a vinculação de contas.
- Configure como o fluxo vai prosseguir se o usuário concordar em vincular a conta. Por exemplo, chame o webhook para processar qualquer lógica de negócios personalizada necessária e volte para a cena de origem.
- Clique em Salvar.
- Em Condições, clique em Se o usuário cancelar ou dispensar a vinculação de contas.
- Configure como o fluxo deve prosseguir se o usuário não concordar em vincular a conta. Por exemplo, envie uma mensagem de confirmação e redirecione para cenas que oferecem funcionalidades que não exigem vinculação de contas.
- Clique em Salvar.
- Em Condições, clique em Se ocorrer um erro de sistema ou de rede.
- Configure como o fluxo deve prosseguir se a vinculação de conta não puder ser concluída devido a erros de sistema ou de rede. Por exemplo, envie uma mensagem de confirmação e redirecione para cenas que oferecem funcionalidades que não exigem vinculação de contas.
- Clique em Salvar.
Processar solicitações de acesso a dados
Se a solicitação do Google Assistente contiver um token de acesso, primeiro verifique se o token de acesso é válido (e não expirou) e recupere a conta de usuário associada do seu banco de dados.