Spring Oauth2 SSO - 无法从Auth服务器注销

时间:2017-04-12 16:12:07

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

我使用的@EnableOauth2Sso遵循类似于Spring oauth2 tutorial中描述的体系结构:auth服务器,启用sso的zuul代理,分离的UI应用程序等。

Auth server   ----  Resource Server (Zuul app) ---- Angular UI App

问题是当UI针对资源服务器注销时,它成功删除了资源服务器JSESSIONID,然后用户被重定向到主页。当用户想要再次登录时,他被重定向到auth服务器,但不是要求用户+密码,而是认为他仍然被记录。 auth服务器JSESSIONID仍在那里,并且不受之前的Resource Server lougout的影响。

我怎样才能从auth服务器注销?

2 个答案:

答案 0 :(得分:2)

由于没有开箱即用的Spring OAuth2 Single Logout,我们必须解决这个问题,创建一个/ revoke端点,调用Auth Server从中注销:

<强> UI:

    $http({
        method: 'POST',
        url: API + '/logout'
    }).then(function() {
        $http({
            method: 'GET',
            url: API + '/auth/oauth/session/revoke'
        }).then(function() {
            window.location = '/';
        });
    });

Zuul服务器:

zuul:
  ...
  routes:
      authServer:
        path: /auth/**
        url: ${authServer.url}/auth/
      ...

验证服务器:

@RestController
public class RevokeController {

    @RequestMapping(value = "/oauth/session/revoke", method = RequestMethod.GET)
    public void revoke(HttpServletRequest request) throws InvalidClientException {
        request.getSession().invalidate();
    }
}

答案 1 :(得分:1)

这是正确的行为,当您从Angular应用程序注销时,它不会从Auth服务器注销。

示例: - 假设我们要使用google或facebook帐户登录stackoverflow.com,我们无需再次输入密码,我们登录Auth服务。

如果我们需要反复显示SSO登录,我们需要注销Angular UI和OAuth服务器。