我正在尝试使用spring OAuth2注销用户。我有一个带有@EnableOAuth2Sso
注释的服务器和一个带有@EnableAuthorizationServer
注释的不同服务器。
Sso服务器使用authorization_code
流来签署用户并具有注销端点,该端点又与授权服务器联系以取消用户的访问和刷新令牌。
调用时,这些令牌会被删除,因为它们不再出现在mongodb中,但只要我刷新页面(连接到Sso服务器),我就会再次自动登录,因为授权服务器会创建一个新的访问权限,刷新令牌。
我怀疑我的Sso服务器仍然有一个有效的授权码,允许它从授权服务器请求新的令牌,但我找不到授权服务器管理这些授权码的位置。有人知道这些存储的位置以及如何使这些授权码无效吗?或者我完全走错了轨道?
更新 :我发现问题确实与dur建议的会话有关。当我在浏览器中删除Sso服务器的会话cookie时,我必须使用授权服务器重新进行身份验证。我不能让Sso服务器破坏我的cookie。我已经尝试手动循环cookie并以下列方式使它们到期(介意我正在使用Kotlin):
@RequestMapping("/logout",
method = [RequestMethod.GET]
)
@ResponseBody
fun redirectToLogout(request: HttpServletRequest) : RedirectView{
...
val uri = authServerInstance.uri.normalize()
val redirectView = RedirectView()
redirectView.url = "$uri/auth/logout"
request.cookies.forEach {
it.maxAge = 0
}
...
return redirectView
}
我还尝试通过以下方式使会话无效:
@RequestMapping("/logout",
method = [RequestMethod.GET]
)
@ResponseBody
fun redirectToLogout(request: HttpServletRequest) : RedirectView{
...
val uri = authServerInstance.uri.normalize()
val redirectView = RedirectView()
redirectView.url = "$uri/auth/logout"
request.session.invalidate()
...
return redirectView
}
在两个实例中,Sso都尝试使会话无效,然后向授权服务器发送请求以使用户的访问和刷新令牌无效,但会话cookie不会失效。
答案 0 :(得分:0)
Sso服务器可以正常删除其会话cookie。我在问题的示例中通过Netflix Zuul重定向到授权服务器的注销端点,这基本上意味着在授权服务器上仍然使用Sso服务器的会话cookie,这意味着授权服务器无法在&#39 ; t销毁其最初从授权服务器上的身份验证页面重定向时创建的会话cookie。
因此,要解决此问题,我现在直接重定向到授权服务器,以便它可以销毁其会话cookie。