使用 chrome.identity.launchWebAuthFlow 时如何防止提前关闭弹出窗口?

How can I prevent early popup closing when using chrome.identity.launchWebAuthFlow?

我正在从我的 Chrome 分机的后台脚本调用 chrome.identity.launchWebAuthFlow

这用于通过 https://login.microsoftonline.com

获取隐式用户身份验证

登录弹出窗口显示正常,允许用户输入凭据。但是,提交凭据后,window 不会重定向到我的回调重定向 uri。相反,它会重定向到另一个不需要用户操作的页面(这是 Microsoft Azure AD 中的某种公司登录页面)。

此时 window 关闭,我在 launchWebAuthFlow 回调函数中得到 undefined 响应。同时我收到控制台错误:未选中runtime.lastError:无法加载授权页面。

相同的流程在浏览器中工作正常window:在提供凭据并重定向到公司登录页面后,它最终被重定向到我的重定向url(已准备好身份验证令牌)。

由此我得出结论,launchWebAuthFlow 并没有等到重定向到我的重定向页面,而是过早地关闭了弹出窗口。

有什么办法可以避免这种情况吗?

我在这上面花了太多时间,但找到了解决方法。

仍然不确定为什么 launchWebAuthFlow 会这样。但我决定以其他方式解决。

发生这种双重重定向是因为 Microsoft 授权页面首先需要输入纯电子邮件地址。这允许它决定重定向到哪个公司授权页面。即使它重复使用当前会话 (cookie),也会发生这种情况。

所以我想方设法缩短路线,并给第一个授权页面一个提示关于接下来应该去哪个公司页面。为此,您必须向 launchWebAuthFlow 使用的 url 添加一个参数:

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
?client_id={client-id}
&response_type=token
&login_hint=user@domain.com
&prompt=login
&redirect_uri={redirect-uri}
&scope={some-scope}

请注意,我还必须添加 prompt=login。它在没有浏览器的情况下工作(实际上在活动会话中甚至更快)。但是,如果从 chrome.identity.launchWebAuthFlow

调用,则需要这样做

希望这对处于类似情况的人有所帮助。

此处有更多详细信息:Microsoft identity platform and Implicit grant flow