我们的生产 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 应用程序。
唯一的问题是用户每次登录时都会看到此批准屏幕