当我尝试在我的Web服务上授权Google智能助理时,“帐户无法链接”错误

时间:2018-01-26 12:40:29

标签: google-oauth2 actions-on-google dialogflow google-assistant-sdk

首先,我想提一下之前在以下主题中讨论过这样的问题: How to authenticate user with just a Google account on Actions on Google?

但我找不到任何与Google智能助理应用与我自己的网络服务器相关联的信息。

问题:

GET https://oauth-redirect.googleusercontent.com/r/my-google-assistant-app#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE始终返回“要关联的帐户字段”错误description

重现方式:

  1. 我在Google Play上的Actions中创建了一个新项目
  2. 我使用Dialogflow
  3. 构建了一个应用程序
  4. 我创建了一个Heroku Web Server作为我的webhook(例如: webhook .herokuapp.com)
  5. 所以一切都运转得很好。我已成功将我的Google智能助理应用与我的webhook连接。

    但后来我决定向另一个需要用户登录的Heroku Web Server(例如: webserver .herokuapp.com)发送请求。所以我决定实施帐户链接我的Google智能助理应用 webserver .herokuapp.com

    1. 我在 webserver .herokuapp.com上实施了Google-OAuth2授权。另外我想提一下,我使用了我的Google智能助理应用程序的客户端ID和客户端密钥
    2. 因此,Google授权在我的网络服务器 .herokuapp.com上完美运行

      1. 然后,我使用隐式流enter image description here
      2. 为我的Google智能助理应用启用了帐户关联设置

        所以,就是这样!

        后记

        我打开Goog​​le智能助理,告诉它“与我的测试应用对话”,然后它迎接我,并提供我链接帐户。我说是”。 然后,我会看到Google智能助理如何在 webserver .herokuapp.com上请求我的登录网址。然后我输入我的Google电子邮件和密码。结果我登录了我的网络服务器!然后我的网络服务器重定向到:

        https://oauth-redirect.googleusercontent.com/r/my-google-assistant-app#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE

        我收到了我在帖子顶部描述的错误。

        任何帮助将不胜感激

        带有参数信息的

        更新

        These are my constants:
        Google Assistant Project_ID = nodejs-sdk-local-test
        Google Assistant Client_ID = 1067979601708-ldr3ga115es3fdo823slfnj46gjoes66.apps.googleusercontent.com
        state = manually_set_state_value
        

        流程是我打开我的Google智能助理并说“好的谷歌,与我的测试应用程序交谈”,它回应了我的请求,然后我说了“做一些需要授权的行动”。 Google智能助理应用程序提供我链接帐户,我说“是”。

        • 这是Google智能助理应用程序调用我的https://webserver.herokuapp.com/google-oauth2端点的地方。此终结点的目的是将我重定向到Google登录页面。

        • 现在我被重定向到Google登录页面(一切似乎都是正确的。client_idstate参数类似于常量)。这是我被重定向到的网址示例:https://accounts.google.com/o/oauth2/auth?client_id=1067979601708-ldr3ga115es3fdo823slfnj46gjoes66.apps.googleusercontent.com&redirect_uri=http://webserver.herokuapp.com/complete/google-oauth2/&state=manually_set_state_value&response_type=code&scope=openid+email+profile

        • 在Google登录页面,我输入了我的凭据,然后我被重定向到redirect_uri=http://webserver.herokuapp.com/complete/google-oauth2端点。此终结点的目的是在webserver.herokuapp.com注册或登录我,然后将我重定向到另一个Google URL。 Google网址的示例:https://oauth-redirect.googleusercontent.com/r/nodejs-sdk-local-test#access_token=<token_omitted>&token_type=bearer&state=manually_set_state_value

        • 所以似乎一切都是正确的。我登录了webserver.herokuapp.com,获得了访问令牌。最后一个Google网址中的project_idstate参数也与常量类似。无论如何,这个谷歌URL返回错误“帐户无法链接”!

1 个答案:

答案 0 :(得分:2)

最常见的原因是,当您重定向到您的网站时,您没有传回发送给您的state相同的值。确保这是相同的值,为了您的安全,请确保您验证发送给您的其他参数。

当用户被重定向到https://webserver.herokuapp.com/google-oauth2时,应该有一些参数作为查询的一部分发送。这些参数包括state参数。看起来应该是这样的:

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

请注意,虽然client_idredirect_uri是您应该期望和测试的值,但state您应该设置的值。 Google每次都会生成不同的内容。这是您在以后重定向到

时应该使用的state
https://oauth-redirect.googleusercontent.com/r/nodejs-sdk-local-test#access_token=<token_omitted>&token_type=bearer&state=STATE_STRING