为什么 Firefox 在使用 Redix OIDC 时自动注销我的用户?
Why is Firefox logging my user out automatically when using Redix OIDC?
我正在构建一个 React 应用程序,我想在其中使用 OpenID Connect 对用户进行身份验证。在我的开发环境中,OIDC 权限是 Identity Server 4 的本地 运行 实例。
我找到一个 Github repo which integrates the oidc-client-js library with Redux so I downloaded the example repo 并将其指向我的身份服务器。我所做的唯一其他更改是使用我的不记名令牌而不是示例使用的 YouTube 调用本地 API。
我有一个Windows环境。
在 Chrome 和 Edge 上,该示例完美运行。我能够使用不记名令牌进行身份验证并成功调用我的本地 API。然而,在 Firefox 上,虽然身份验证工作正常并且我的 API 被成功调用并显示结果,但几秒钟后应用程序突然出现让用户注销。 (我说 'appears' 是因为它表现得好像用户已注销,但如果我重新加载页面,则用户已经通过身份验证)。
注意:我在这里划掉了一部分。这是一条红鲱鱼。请参阅下面的 更新 1,其中描述了 Firefox 如何添加第二个 iframe。没有为我的客户端注册重定向 URL,导致重定向到 IS4 的错误页面,该页面负责这些 CSP 警告。
查看控制台日志,Chrome 和 Firefox 之间的一个主要区别是我在 Firefox 中看到的警告:
Content Security Policy: Ignoring ‘x-frame-options’ because of ‘frame-ancestors’ directive.
这会在验证用户身份后一两秒出现在控制台中。我怀疑这可能与 Javascript OIDC 客户端为检查会话而添加的 iframe 有关。此 iframe 指向身份权限上的 /connect/checksession。
如果我在 Firefox 中导航到此检查会话 URL,我会在控制台中收到 Javascript 错误:
Content Security Policy: The page's settings blocked the loading of a
resource at self ("script-src").
我在 Chrome 中没有看到这个错误。
此页面的 Content-Security-Policy
是 default-src 'none'; script-src 'sha256-VDXN0nOpFPQ102CIVz+eimHA5e+wTeoUUQj5ZYbtn8w='
我可以提供的唯一其他信息是控制台日志,这些日志以 Firefox 的形式编写,似乎将用户注销:
Action type: redux-oidc/USER_SIGNED_OUT
Action payload: undefined
State before: Object { routing: {…}, oidc: {…}, subscriptions: {…} }
State after: Object { routing: {…}, oidc: {…}, subscriptions: {…} }
我希望有人可以使用此信息为我指明正确的方向,因为我真的不确定这里的问题是什么。看来问题出在 Identity Server 中,因为它报告 Firefox 在检查会话时出现 Javascript 错误,但我不确定我能做些什么。
更新 1
深入研究后,我发现当第二个 iframe 添加到页面时会出现问题,该页面使用 [=78= 调用身份授权机构的 connect/authorize 端点] 像这样:http://identity.domain.com/connect/authorize?client_id=js&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fsilent_renew.html&response_type=id_token&scope=openid&state=9d87c43c58c84fddbde5fd9aa0f97df7&nonce=826fb8d6dc114549810584ddd01a3271&prompt=none。这只发生在 Firefox 上。在 Chrome 和 Edge 中,永远不会添加第二个 iframe。查看 Identity Server 日志,我看到在响应此 connect/authorize 调用期间记录了以下行(以及其他行):
No user present in authorize request
Showing error: prompt=none was requested but user is not authenticated".
但我仍然无法理解为什么会这样。
当直接使用 oidc-client-js 时,我在 Chrome 中间歇性地看到了这种行为。在我的例子中,在 UserManager 上添加对 clearStaleState 的调用似乎阻止了这种情况的发生。
编辑:具体来说,我在调用 getUser() 之前添加了它。
但由于它是间歇性的,如果您注销并清除 cookie 和 local/session 存储,它会消失一段时间,我不能保证这会修复它。
几个月后,我再次遇到了这个问题。这次我找出了问题所在。我在非本地主机域上本地托管我的身份服务器,但我的 React 应用程序在本地主机上 运行。因此,Firefox 跟踪保护启动并阻止 Javascript OIDC 客户端通过其 iframe 访问我的身份服务器上的 cookie。切换到在本地主机端口上使用身份服务器解决了这个问题。我希望这对某人有帮助:)
我正在构建一个 React 应用程序,我想在其中使用 OpenID Connect 对用户进行身份验证。在我的开发环境中,OIDC 权限是 Identity Server 4 的本地 运行 实例。
我找到一个 Github repo which integrates the oidc-client-js library with Redux so I downloaded the example repo 并将其指向我的身份服务器。我所做的唯一其他更改是使用我的不记名令牌而不是示例使用的 YouTube 调用本地 API。
我有一个Windows环境。
在 Chrome 和 Edge 上,该示例完美运行。我能够使用不记名令牌进行身份验证并成功调用我的本地 API。然而,在 Firefox 上,虽然身份验证工作正常并且我的 API 被成功调用并显示结果,但几秒钟后应用程序突然出现让用户注销。 (我说 'appears' 是因为它表现得好像用户已注销,但如果我重新加载页面,则用户已经通过身份验证)。
注意:我在这里划掉了一部分。这是一条红鲱鱼。请参阅下面的 更新 1,其中描述了 Firefox 如何添加第二个 iframe。没有为我的客户端注册重定向 URL,导致重定向到 IS4 的错误页面,该页面负责这些 CSP 警告。
查看控制台日志,Chrome 和 Firefox 之间的一个主要区别是我在 Firefox 中看到的警告:
Content Security Policy: Ignoring ‘x-frame-options’ because of ‘frame-ancestors’ directive.
这会在验证用户身份后一两秒出现在控制台中。我怀疑这可能与 Javascript OIDC 客户端为检查会话而添加的 iframe 有关。此 iframe 指向身份权限上的 /connect/checksession。
如果我在 Firefox 中导航到此检查会话 URL,我会在控制台中收到 Javascript 错误:
Content Security Policy: The page's settings blocked the loading of a resource at self ("script-src").
我在 Chrome 中没有看到这个错误。
此页面的 Content-Security-Policy
是 default-src 'none'; script-src 'sha256-VDXN0nOpFPQ102CIVz+eimHA5e+wTeoUUQj5ZYbtn8w='
我可以提供的唯一其他信息是控制台日志,这些日志以 Firefox 的形式编写,似乎将用户注销:
Action type: redux-oidc/USER_SIGNED_OUT
Action payload: undefined
State before: Object { routing: {…}, oidc: {…}, subscriptions: {…} }
State after: Object { routing: {…}, oidc: {…}, subscriptions: {…} }
我希望有人可以使用此信息为我指明正确的方向,因为我真的不确定这里的问题是什么。看来问题出在 Identity Server 中,因为它报告 Firefox 在检查会话时出现 Javascript 错误,但我不确定我能做些什么。
更新 1
深入研究后,我发现当第二个 iframe 添加到页面时会出现问题,该页面使用 [=78= 调用身份授权机构的 connect/authorize 端点] 像这样:http://identity.domain.com/connect/authorize?client_id=js&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fsilent_renew.html&response_type=id_token&scope=openid&state=9d87c43c58c84fddbde5fd9aa0f97df7&nonce=826fb8d6dc114549810584ddd01a3271&prompt=none。这只发生在 Firefox 上。在 Chrome 和 Edge 中,永远不会添加第二个 iframe。查看 Identity Server 日志,我看到在响应此 connect/authorize 调用期间记录了以下行(以及其他行):
No user present in authorize request
Showing error: prompt=none was requested but user is not authenticated".
但我仍然无法理解为什么会这样。
当直接使用 oidc-client-js 时,我在 Chrome 中间歇性地看到了这种行为。在我的例子中,在 UserManager 上添加对 clearStaleState 的调用似乎阻止了这种情况的发生。 编辑:具体来说,我在调用 getUser() 之前添加了它。
但由于它是间歇性的,如果您注销并清除 cookie 和 local/session 存储,它会消失一段时间,我不能保证这会修复它。
几个月后,我再次遇到了这个问题。这次我找出了问题所在。我在非本地主机域上本地托管我的身份服务器,但我的 React 应用程序在本地主机上 运行。因此,Firefox 跟踪保护启动并阻止 Javascript OIDC 客户端通过其 iframe 访问我的身份服务器上的 cookie。切换到在本地主机端口上使用身份服务器解决了这个问题。我希望这对某人有帮助:)