客户端,Auth服务器和注销

时间:2016-04-05 10:54:34

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

所以,我有一个独立的OAuth2 auth服务器和客户端应用程序(基于Web),所有这些都使用Spring OAuth2。

我在Auth服务器上有一个登录表单主机,使用Spring安装程序(通过登录表单)从客户端应用程序重定向等。

到目前为止一切都很好。

我在客户端添加了注销设置:

.and()
  .logout()
  .addLogoutHandler(oauth2LogoutHandler())
  .logoutSuccessUrl("/")
  .clearAuthentication(true)
  .deleteCookies("JSESSIONID")
  .invalidateHttpSession(true)
  .permitAll()

所有人似乎'没事。

然而,如果我然后点击登录'我的客户端上的链接,当它重定向到授权应用程序时我没有登录屏幕,但只是重定向握手发生,我回到客户端应用程序。

所以,问题是,它需要什么才能清除'在我注销客户端应用程序时在Auth服务器上?会话信息以某种方式持续存在于auth应用程序中,但我无法找到当我点击登录时该会话是如何被接收的?是否有一种干净的方式来宣传退出'到Auth服务器?

非常感谢

马丁

2 个答案:

答案 0 :(得分:1)

https://spring.io/blog/2015/02/03/sso-with-oauth2-angular-js-and-spring-security-part-v#the-logout-experience为一个众所周知的棘手问题描述了同样的问题。

  

退出体验

     

如果单击“注销”链接,您将看到主页更改(不再显示问候语),因此用户不再使用UI服务器进行身份验证。单击“登录”,您实际上无需返回授权服务器中的身份验证和批准周期(因为您尚未注销)。关于这是否是一个理想的用户体验的意见将被分开,这是一个众所周知的棘手问题(Single Sign Out:Science Direct文章和Shibboleth文档)。理想的用户体验可能在技术上不可行,并且您有时也必须怀疑用户是否真的想要他们想要的内容。 “我希望'退出'让我退出”听起来很简单,但明显的反应是,“退出了什么?你想要退出这个SSO服务器控制的所有系统,或者只是你点击了“注销”链接的那个系统吗?“我们没有足够的空间在这里更广泛地讨论这个话题,但它确实值得更多注意。如果您有兴趣,那么有一些关于Open ID Connect规范中的实现原理和一些(相当不公正的)想法的讨论。

这是我在github上提交的PR,用于基于Spring的OpenID Connect(扩展OAuth2)项目,以在授权服务器上实现“结束会话端点”:https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/pull/972。它实现了RP发起(或客户端启动)注销的https://openid.net/specs/openid-connect-session-1_0.html#RPLogout规范的一部分。

我认为Spring没有内置的机制。除了我部分实现的规范之外,还有其他规范用于注销。无论您选择哪种方式,遵循文档规范都可能是一个好主意。

答案 1 :(得分:0)

您应该启用注销以扩展WebSecurityConfigurerAdapter并创建一个注销页面,将帖子发送到授权应用程序中的/ logout

退出页面:(resources / templates / logout.ftl)

<html>
<head>
  <title>Logout Page</title>
</head>
<body>
    <form role="form" action="logout" method="post">
        Logout
          <input type="hidden" id="csrf_token" name="${_csrf.parameterName}" value="${_csrf.token}"/>
          <input type="hidden" id="redirect" name="redirect" value="${RequestParameters['redirect']!'/login'}"/>
          <button type="submit">Logout</button>
    </form>
</html>

隐藏的重定向输入将在注销后重定向到客户端应用程序