Alexa 技能帐户与 Google API 凭据链接,刷新令牌出现问题

Nic*_*ini 3 google-api google-authentication alexa alexa-skill alexa-skills-kit

我在 Alexa 帐户链接授权方面遇到了一些问题。

这些是我遵循的步骤:

  1. 我从 Google Cloud Console 获得了凭据(客户端 ID、客户端机密...)
  2. 在 Alexa 开发者控制台上设置,使用“Auth Code Grant”作为授权授权类型
  3. 激活了我的 Alexa 应用程序上的技能并使用我的 Google 帐户成功登录
  4. 现在我在请求中获得了访问令牌,在 handler_input.request_envelope.context.system.user.access_token

问题是访问令牌在一小时后过期,Alexa 不管理令牌的刷新

我应该怎么做才能避免每次一小时后都要求我的用户登录?我应该Implicit grant用作授权类型吗?我应该以某种方式获得刷新令牌吗?

附加信息:这是一项使用 Python3 连接到 AWS Lambda 的自定义技能

Nic*_*ini 5

虽然@pinoyyid 的回答是正确的,但它没有提供解决方案,所以我发布了一个以供将来参考。

问题确实是亚马逊服务器没有收到谷歌的刷新令牌,因此无法在访问令牌过期一小时后刷新。

按照链接和其他亚马逊论坛帖子,我找到了一个可行的解决方案。

亚马逊 Alexa 开发者控制台“账户关联”配置:

  • 授权授予类型:Auth Code Grant
  • 授权 URI:https : //accounts.google.com/o/oauth2/v2/auth? access_type =offline(即使来自 google 凭据的不是 v2,它也不应该有什么区别) 访问类型非常重要,因为,正如文档所说:

    如果您的应用程序需要在用户不在浏览器中时刷新访问令牌,请将 [access_type] 值设置为离线。[...] 该值指示 Google 授权服务器在您的应用程序第一次为令牌交换授权代码时返回刷新令牌和访问令牌。

  • 访问令牌 URI:https : //accounts.google.com/o/oauth2/token
  • 客户端 ID 和密钥:在 Google Cloud Platform 上下载
  • 客户端认证方案:HTTP Basic
  • 域列表:google.comgoogleapis.com
  • 默认访问令牌到期时间:留空

现在,这样做并保存配置后,要知道,你可能不会注意到的变化,因为,从这里

当 Alexa 使用刷新令牌为现有用户检索新的访问令牌时,Alexa 使用在用户链接其帐户时配置的访问令牌 URI。因此,如果您稍后更改访问令牌 URI,之前链接其帐户的用户将继续使用旧 URI 来检索更新的令牌。用户必须取消链接并重新链接帐户才能切换到新的访问令牌 URI。

因此,为了完成该程序:

  1. 停用您的技能
  2. 转到有权访问您数据Google 第三方应用程序,并删除与您关联的 Google 项目
  3. 重新激活您的技能并再次登录(如果正确完成,它应该再次询问您在 Alexa 开发人员控制台中指定的范围的权限
  4. 完毕!一小时后你应该重试,它应该有一个更新的访问令牌

附加信息

我发现很多人建议检索刷新令牌,我不相信这是可能的,因为即使 Google 发送它,亚马逊也会存储它并使用它来刷新访问令牌。

编辑: 这适用于开发和测试,但我在这里发现,出于发布目的,您必须拥有将用户重定向到的登录页面。对我来说,只需要创建一个托管在公共 S3 存储桶中的简单 HTML 页面,它将请求重定向到我之前编写的授权 URI,而访问令牌 URI 必须保持为 Google 的。