从Chrome自定义标签重定向到Android应用程序时,“导航被阻止”。

21

我正在将我们的登录小部件“现代化”,使用Chrome自定义标签作为Google将在几个月内开始阻止使用Webview的OAuth请求

登录小部件与我们的身份验证服务配合工作,该服务支持经典的“用户名和密码”登录和社交登录,通过在授权代码流中扮演Google/Facebook/...的OAuth2“客户端”来实现。因此,来自Google的授权代码被传递到此身份验证服务,该服务反过来向我们的登录小部件提供访问令牌。

访问令牌通过客户端重定向传递回移动应用程序:

window.location.replace('com.acmeusercontent.tenants.abc:\/setTokenData?accessToken='+access_token+'#');

针对经典登录,用户填写用户名和密码并提交后,会返回访问令牌,并触发自定义URI方案的重定向来触发RedirectReceiverActivity的意图过滤器。

然而,对于社交登录,在重定向时除了Android Monitor中的这一行之外,什么都不会发生:

I/chromium: [INFO:CONSOLE(0)] "Navigation is blocked: com.acmeusercontent.tenants.abc:/setTokenData..."

仅为明确起见:对于经典登录和社交登录,客户端重定向完全相同,但在经典登录后允许,而在社交登录后被阻止! 如果我在小部件中添加一个按钮,在社交登录后执行完全相同的重定向,它会再次允许-只要用户点击即可。
这让我感到困惑: -为什么有时允许重定向,有时又被阻止? -除了要求用户在社交登录序列完成后单击按钮之外,是否有任何方法可以绕过此问题?
我尝试了我能想到的一切:使用“intent:”语法,从代码模拟按钮点击,使用服务器端重定向等,但都没有成功。 此外,我研究了AppAuth libraries与Google身份验证示例,并且据我所知,我正在做完全相同的事情。
1个回答

30

我是AppAuth的首席维护者。

在Chrome端触发重定向到应用程序的策略,无论是通过自定义方案还是https 应用链接,都必须由用户触发,而不是JavaScript。我认为这里的意图是防止用户惊讶地发现站点在未经明确“同意”(即点击链接)的情况下打开了一个应用程序。

这对于立即将重定向返回到授权请求的重定向提供程序来说是有问题的:在打开自定义选项卡和重定向之间没有任何操作。

我维护一个演示,展示如何在用户单击后捕获OAuth重定向并将其转发到应用程序:

https://github.com/iainmcgin/AppAuth-Demo

另一个潜在的选择是在后端捕获重定向参数,然后使用302重定向响应浏览器到您的自定义方案。由于这保持了来自用户操作的单个重定向“链”,因此应该是允许的。不幸的是,这更加复杂,因为现在您可能需要使用OAuth2状态参数作为密钥,在应用程序重定向发生后从服务器检索参数。 AppAuth无法直接帮助,因为它期望授权响应直接从浏览器提供给它。


8
iOS版Chrome与Android或桌面版本的Chrome相比有很大不同-链接处理策略由系统而非浏览器控制。相较于Android,iOS对通用链接的解释方式存在差异。 - iainmcgin
我们遵循后端捕获并返回302重定向到浏览器的建议,在大多数情况下这种方法是有效的,但在Dropbox授权流程中失败了,我们无法弄清原因,但有一个报告表明时间可能很重要(即,如果流程时间太长,它将被阻止)。在自定义选项卡或常规浏览器(Chrome)中失败... https://bugs.chromium.org/p/chromium/issues/detail?id=738724 - hmac
如果您查看上面的链接,您会发现有一个待定的Chrome增强功能(#user-activation-v2),它解决了我的问题。 - hmac
7
Chrome对此事的政策有官方参考资料吗?谢谢。 - ori888

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接