【问题标题】:log out from Oauth2 server AND from all clients从 Oauth2 服务器和所有客户端注销
【发布时间】:2018-02-07 20:12:48
【问题描述】:

我们有一个 java web 应用程序,其中包含很多战争。我们有一个 Oauth2 服务器(由我们编写),我们将有很多客户端(大约 8 个)。所有这些都将在同一个域下。除此之外,我们还有另一个应用程序(在完全不同的 tomcat 上运行。使用了 Liferay)。这个想法是用户将在使用一个应用程序时使用它们,并且他们不应该看到很大的差异。 这就是现在我需要的是,当我以某种方式从一个地方注销时,说 oauth2 服务器和所有其他客户端也注销。 因为对于客户应该是:我已经注销了为什么在某些部分我仍然登录? 目前我不知道该怎么做。 我在很多地方读到,通常这不是惯例。 你能给我提示并解释我可以从哪里开始吗?也许在我的情况下使用 Oauth2 不是最佳选择?

【问题讨论】:

  • Silvia,您想要的称为单点登录 (SSO)。有一个OpenID Connect Session Management RFC 讨论了如何实现它。
  • 也许这个链接可以提供帮助:baeldung.com/sso-spring-security-oauth2
  • 感谢您的链接,但没有信息如何以我们想要的方式注销。
  • @SilviaPetrova OAuth2 规范不支持它,所以一般来说这是不可能的。但在某些情况下,根据您的实施情况,您可以实施它。如果您的实现使用令牌(始终通过授权服务器调用/数据库调用检查),您可以更改此端点/数据库访问的实现。例如,这对于 JWT 是不可能的。

标签: java spring-security oauth-2.0


【解决方案1】:

根据您的要求,您可以使用 Spring Security 的 JDBC Token Store 来实现 OAuth2。为了在用户注销后正常工作,所有客户端都应调用您的删除令牌 API,您可以在其中删除访问令牌

    @FrameworkEndpoint
    public class RevokeTokenEndpoint {

        @Resource(name = "tokenServices")
        ConsumerTokenServices tokenServices;

        @RequestMapping(method = RequestMethod.DELETE, value = "/oauth/token")
        @ResponseBody
        public void revokeToken(HttpServletRequest request) {

            //Delete the Token
        }
    }

另外,你应该删除刷新令牌。这样,一旦用户注销,令牌就会失效,后续客户端不能再使用相同的令牌

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2015-07-09
    • 2020-04-27
    • 2020-06-06
    • 2018-10-25
    相关资源
    最近更新 更多