授权代码流和多个选项卡

时间:2019-05-15 15:55:06

标签: java spring-boot spring-security oauth-2.0

我需要了解在OAuth2-授权代码流授予期间如何避免或如何管理粘性会话,尤其是在以下期间: GET / uaa / oauth / authorize,POST / uaa / login,然后再次GET / uaa / oauth / authorize

我们的身份验证服务仅服务于我们拥有的两个Web应用程序,每个Web应用程序都是一台资源服务器,用于检查令牌和有效性。如果没有令牌或令牌无效,它们将直接重定向到Auth Server登录页面(真正告诉第一个调用GET / oauth / authorize)。

授权代码流授权需要执行以下步骤:

-首次调用以注册客户端请求GET / uaa / oauth / authorize,并在会话中存储(在我的情况下为Spring Redis)一些信息,例如客户端的callbackurl

-通过用户凭证POST / login登录第二次呼叫

-第三次调用以获得ACCESS_CODE GET / uaa / oauth / authorize,从会话中检索回调URL。

但是,如果我假冒来自两个不同客户端的两个请求,并在同一浏览器中打开两个不同标签,该怎么办?

例如一个带有:

http://localhost:9191/uaa/oauth/authorize?response_type=code&client_id=client-one&scope=auth&redirect_uri=http://localhost:8080/client-one

,另一个带有:

localhost:9191/uaa/oauth/authorize?response_type=code&client_id=client-two&scope=auth&redirect_uri=http://localhost:8080/client-two

春季会议变得混乱。例如:

  • 在Tab1上打开WebApp1,然后在Tab2上打开WebApp2。
  • 登录Tab1将重定向到WebApp2重定向uri。
  • 然后登录到Tab2将返回到/ uaa /,导致404。

我尝试自定义SessionRepository失败,但是将其他服务与Oauth2结合使用时,我开始相信我至少需要每个Web应用程序中的一页,在第一次调用GET / oauth / authorize之前进行代理

是否有最佳实践建议来避免这种流程引起的麻烦?

还是不用HTML页面即可管理多个标签的某种方法? Spring-Security默认使用粘性会话。

谢谢您的时间。

1 个答案:

答案 0 :(得分:0)

我最终实现了像nonce这样的东西,默认情况下不受Spring安全支持(据我所知Github Spring Security)。

如果用户尝试使用与最新随机数不同的随机数进行身份验证,我会将他踢到错误页面,并显示诸如“登录会话已过期”之类的消息,并带有指向Web应用程序的链接。