【问题标题】:Spring OAuth2 - How does the authorization server handle the Security Context with two instances of a client?Spring OAuth2 - 授权服务器如何处理具有两个客户端实例的安全上下文?
【发布时间】:2018-05-26 07:48:11
【问题描述】:

我目前正在处理 OAuth2 Spring 客户端(AB)的两个实例联系同一个 AuthorizationServer (C) 的场景。在 Chrome 上使用两个窗口时,一个正常,一个在隐身模式下,这工作正常。

AB 都联系 C,我可以使用两个不同的帐户登录,并且用户端点返回正确的 Principal 和给定用户。

但是,如果我从A在同一个浏览器窗口中切换客户端,并在B上调用登录路径,登录界面没有提示,我是立即以 BA 窗口中的同一用户身份登录。

我检查了这是否是由于 cookie 造成的,但似乎并非如此。我无法理解不与 A 通信的 B 如何知道发送正确的令牌并检索来自 C 的安全数据连接到 A。我在隐身模式和普通模式都试过这个,两次都返回了另一个主体。

总而言之,我的问题是:B 如何发送连接到 AC 的登录过程的数据,反之亦然相同的浏览器会话?

【问题讨论】:

  • 客户端都是使用 Spring 框架用 Java 编写的。我正在使用OAuth2ClientAuthenticationProcessingFilterResourceServerTokenServices 的自定义实现
  • 我发现在通信过程中确实有一个JSESSIONID被创建。一旦我切换了cookie并尝试登录,我就切换了用户。我错过了这个,因为我们应用程序的其他部分也创建了这个 cookie,并认为它只是另一个 cookie。

标签: spring spring-mvc spring-security oauth-2.0 spring-security-oauth2


【解决方案1】:

但是,如果我在同一浏览器窗口中从 A 切换客户端,并且 调用B上的登录路径,登录界面没有提示,我是 立即以与 A 的窗口中相同的用户身份登录,在 B.

坦率地说,这是因为在您登录时生成的 access_token 与客户端凭据(用于识别客户端,用于区分登录请求来自 A 还是 B)之间没有关系。仅在生成 access_token 时才重要。

在一个简单的情况下,用户 X 通过网站请求 OAuth2 Bearer access_token,而 Iphone 将导致生成 2 个唯一的 access_token 并保存在服务器后端。

如果用户 X 以某种方式获取网站中生成的 access_token 并在 Header 中使用它

Authorization: Bearer <Website Generated access_token>

在调用受保护端点时,用户 X 不会出现 401 或 403,因为发送的 access_token 实际上在后端服务器中可用。仅验证 access_token 是否仍然有效(将执行未过期)。

【讨论】:

  • 嗯,这是有道理的。我现在唯一不明白的一件事是,当 B 在与 A 相同的窗口中访问但之前未访问时,如何获取 access_token?它是否存储在浏览器会话中的某个位置?同时,我查看了 spring 库,发现刷新令牌的逻辑没有问题。这只是第一次令人困惑。
  • 不,我正在使用 Spring OAuth2 库中的 OAuth2ClientAuthenticationProcessingFilter ResourceServerTokenServices(自定义实现)。
猜你喜欢
  • 1970-01-01
  • 2012-12-17
  • 2013-08-23
  • 2015-06-25
  • 2015-03-31
  • 1970-01-01
  • 2018-09-26
  • 2011-07-02
  • 1970-01-01
相关资源
最近更新 更多