我已经为我的操作编写了一个授权流程,以使用“隐式流程”进行帐户链接。我一直在使用网络模拟器对其进行测试。当我尝试在网络模拟器中运行该操作时,它会告诉我链接我的帐户,并提供一个 URL:
我运行该 URL,这就是发生的情况:
- 我的 Java servlet 收到来自 google 的身份验证请求。它包含记录的内容、GOOGLE_CLIENT_ID、REDIRECT_URI、STATE 和“response_type=token”
- 我从使用 UserServiceFactory.getUserService().getCurrentUser().getUserId() 登录的 Google ID 创建访问令牌
- 我制作了一个指向重定向 uri 的 URL,其中包含我的 ACCESS_TOKEN、token_type=bearer 和 state= 我最初收到的状态字符串
- 我为包含该链接的用户创建了一个网页,以便他们可以单击它并执行该链接并链接我的帐户。
效果很好,响应是一个空白页面,其 URL 显示:“ https://www.google.com/?result_code=SUCCESS&result_message=Accounts+now+linked ”。
但是,我想要一个允许用户确保他们已登录并登录到他们想要链接的 Google 帐户的流程
因此,我还提供了一个链接,如果他们愿意,可以将其注销。该链接是使用 userService.createLogoutURL(thisUrl) 创建的
如果他们这样做,我会向他们提供一个登录链接,使用 userService.createLoginURL(thisUrl) 创建
一旦他们使用不同的 Google ID 登录,他们就会回到原来的页面,允许他们再次注销或单击“链接帐户”链接。
情况是,如果他们现在单击“链接帐户”链接,在他们注销之前会成功运行的完全相同的链接(除了不同的 ACCESS_TOKEN 值)并使用不同的帐户重新登录,响应为空白网页的网址显示:“ https://www.google.com/?result_code=FAILURE&result_message=Account+linking+failed ”
有两点需要注意:
- 如果他们注销并使用同一帐户重新登录,则“链接帐户”URL 可以正常工作
- 如果他们在开始该过程时根本没有登录,然后登录然后使用“链接帐户”链接它工作正常
因此,唯一失败的情况是他们登录、注销、使用其他帐户登录,然后单击以链接帐户。那是它失败的时候。
帐户无关紧要,多个不同的帐户都可以使用,只要浏览器登录到第一个帐户并且在流程中不更改即可。
老实说,我无法想象这是如何发生的。
如果我在 Google Home 应用程序中执行此操作,情况会变得更糟,因为它会返回一些“格式错误的请求错误”页面并且基本上永久停止工作。停止/开始动作没有帮助。停止/启动 Web 服务没有帮助。重新启动 Android 设备没有帮助。Google Home 应用中的关联帐号已永久损坏。我能够让它再次工作的唯一方法是在我的 Android 设备上的 Chrome 浏览器中使用帐户链接 URL(从网络模拟器获得),这似乎“重置”了所有内容。