所以,我有一个独立的OAuth2 auth服务器和客户端应用程序(基于Web),所有这些都使用Spring OAuth2。
我在Auth服务器上有一个登录表单主机,使用Spring安装程序(通过登录表单)从客户端应用程序重定向等。
到目前为止一切都很好。
我在客户端添加了注销设置:
.and()
.logout()
.addLogoutHandler(oauth2LogoutHandler())
.logoutSuccessUrl("/")
.clearAuthentication(true)
.deleteCookies("JSESSIONID")
.invalidateHttpSession(true)
.permitAll()
所有人似乎'没事。
然而,如果我然后点击登录'我的客户端上的链接,当它重定向到授权应用程序时我没有登录屏幕,但只是重定向握手发生,我回到客户端应用程序。
所以,问题是,它需要什么才能清除'在我注销客户端应用程序时在Auth服务器上?会话信息以某种方式持续存在于auth应用程序中,但我无法找到当我点击登录时该会话是如何被接收的?是否有一种干净的方式来宣传退出'到Auth服务器?
非常感谢
马丁
答案 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>
隐藏的重定向输入将在注销后重定向到客户端应用程序