为什么 Android Chrome 从 61.0.3163.98 更新到 72.0.3626.76 会破坏 Chrome 自定义选项卡中的 OAuth 登录?

2024-02-05

我们的生产 Android 应用程序使用 Chrome 自定义选项卡进行 OAuth 登录

昨天 Chrome 版本为 61.0.3163.98 时工作正常

在将 Chrome 隔夜更新到 72.0.3626.76 后,登录过程会卡在嵌入式浏览器中,并且用户会看到空白屏幕。

如果我们卸载 Chrome 更新,登录将再次开始工作

Chrome 和/或 Chrome 自定义选项卡发生了什么变化,导致我们的登录流程中断?

如果我将默认浏览器切换为 Firefox,我的应用程序登录工作正常。

事实上,如果我将默认浏览器更改为除 Chrome 之外的任何浏览器,它都可以正常工作,甚至 Opera 也可以工作,尽管 Opera 不显示嵌入式浏览器。

当我卸载 Chrome 更新并恢复到 Chrome 版本 61.0.3163.98 时,它也有效

更多细节:-

Step 1). Load URL with prompt=none and my custom scheme Redirect URL.
Step 2). My App receives a NEW INTENT containing the auth code.
Step 3). I attempt to access my back end APIs with this code, which fails with 400
Step 4). Load URL prompt=login and my users are presented with a sign in screen where they enter their credentials and click on the Sign In button.
Step 5). NOTHING HAPPENS, the user is presented with a blank screen, my app does not receive a NEW INTENT.

这是我用来通过 Chrome 自定义选项卡打开登录 URL 的代码

private void openCustomTab() {
    codeVerifier = generateRandomCodeVerifier();
    checkCodeVerifier(codeVerifier);
    codeChallenge = deriveCodeVerifierChallenge(codeVerifier);

    CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
    CustomTabsIntent customTabsIntent = builder.build();
    customTabsIntent.launchUrl(this, getURL(PROMPT_NONE));
}

上面的代码使用prompt=none加载URL,它还指定我的自定义方案重定向URL。

我的 Android 应用程序在 onNewIntent 中收到一个包含 authCode 的新意图,我尝试使用此 authocode 检索访问令牌,但失败并返回 400。

然后,我使用自定义选项卡加载第二个带有提示=登录的 URL,如下所示:-

            final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
            builder.setToolbarColor(Color.BLUE);

            final CustomTabsIntent customTabsIntent = builder.build();
            customTabsIntent.launchUrl(SignInActivity.this, getURL(PROMPT_LOGIN, authCode));

通过使用 Prompt=login 加载此 URL,用户可以输入其凭据并单击“登录”按钮。

此时 Chrome 自定义标签卡住了。

这是我使用 Stetho 捕获的网络调用,最后一次调用是authorization.ping,显示为已取消

我找到了解决此问题的方法如下:-

我在现有的“无”然后“登录”提示的基础上添加了“同意”的附加提示。

现在用户会看到一个标题为“同意”的屏幕

oauth.approval.page.template.title

用户可以看到可选选项列表,包括

ACCESS TO YOUR DATA
SIGN IN WITH OPENID CONNECT
OPENID CONNECT PROFILE SCOPE
OPENID CONNECT EMAIL SCOPE

在此屏幕底部有两个选项

oauth.approval.page.template.allow
oauth.approval.page.template.dontAllow

当用户选择

oauth.approval.page.template.allow

他们现在可以进入 Android 应用程序。

唯一的问题是用户每次登录时都会看到此批准屏幕


我最近回答了同样的问题,我相信 Chrome 的更新增加了一些安全层。我之前在使用不同的浏览器时也遇到过同样的问题(带有不同非官方自定义ROM的股票浏览器),我认为如果其他浏览器实现相同的行为,我们就不安全。

为了避免所有这些问题,我建议您实现一个暂存页面来处理所有 OAuth2 重定向。

该解决方案还具有避免用户每次都“允许”登录的优点。

您可以在这里找到详细的答案:如何使用 Chrome 自定义选项卡实现 OAuth 单点登录/注销 https://stackoverflow.com/questions/54398667/how-to-implement-oauth-single-sign-in-sign-out-with-chrome-custom-tabs/54506866#54506866

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Android Chrome 从 61.0.3163.98 更新到 72.0.3626.76 会破坏 Chrome 自定义选项卡中的 OAuth 登录? 的相关文章

随机推荐