当授权服务器没有访问权限或刷新令牌时,Spring OAuth2Sso仍然可以登录用户

时间:2018-04-25 14:52:37

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

我正在尝试使用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不会失效。

1 个答案:

答案 0 :(得分:0)

Sso服务器可以正常删除其会话cookie。我在问题的示例中通过Netflix Zuul重定向到授权服务器的注销端点,这基本上意味着在授权服务器上仍然使用Sso服务器的会话cookie,这意味着授权服务器无法在&#39 ; t销毁其最初从授权服务器上的身份验证页面重定向时创建的会话cookie。

因此,要解决此问题,我现在直接重定向到授权服务器,以便它可以销毁其会话cookie。