Alexa技能帐户与Google API凭据关联,刷新令牌时出现问题

时间:2019-01-14 09:08:20

标签: google-api alexa alexa-skills-kit google-authentication alexa-skill

我的Alexa帐户链接授权存在一些问题。

这些是我遵循的步骤:

  1. 我从Google云控制台获得了凭据(客户端ID,客户端密码...)
  2. 使用“身份验证代码授予”作为授权授予类型在Alexa开发人员控制台上进行设置
  3. 激活了我的Alexa应用程序上的技能,并成功使用我的Google帐户登录
  4. 现在我在handler_input.request_envelope.context.system.user.access_token的请求中获得了访问令牌

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

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

其他信息:这是一项自定义技能,可使用Python3连接到AWS Lambda

2 个答案:

答案 0 :(得分:1)

您读过https://developer.amazon.com/docs/account-linking/configure-authorization-code-grant.html吗?

我的猜测是,由于您已经自动安装了该应用程序,因此缺少刷新令牌。 RT仅发布一次。尝试进入https://myaccount.google.com/permissions?utm_source=google-account&utm_medium=web撤消权限,然后重试。

答案 1 :(得分:0)

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

问题确实是Amazon服务器没有收到Google的刷新令牌,因此无法在一个小时的过期时间后刷新访问令牌。

this链接和其他Amazon论坛帖子之后,我找到了一个可行的解决方案。

Amazon 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.com googleapis.com
  • 默认访问令牌到期时间:留空

现在,执行此操作并保存配置之后,请注意,您可能不会注意到更改,例如here

  

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

因此,为了完成该过程:

  1. 停用技能
  2. 转到Google third party applications that have access to your data并删除与您关联的Google Project
  3. 重新激活您的技能并再次登录(如果操作正确,它将再次询问您在Alexa开发人员控制台中指定的范围的权限
  4. 完成!一小时后,您应该重试,并且应该有一个更新的访问令牌

其他信息

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