KEYCLOAK VERTX注销

KEYCLOAK VERTX logout

我目前正在将 keyckloak 与 vertx 一起使用,我正在尝试从我的应用程序注销,但我无法删除令牌。当我注销时,我仍然可以访问私人页面。你能给我一些建议吗?

这是我的代码:

    InputStream input = new FileInputStream("./config.properties");
    Properties prop = new Properties();
    prop.load(input);

    String resource = prop.getProperty("resource");
    String credentials = prop.getProperty("credentials");
    int listeningPort = Integer.parseInt(prop.getProperty("listeningPort"));

    OpenIDConnectAuth.discover(vertx, 
            new OAuth2Options()
            .setFlow(OAuth2FlowType.AUTH_CODE)
            .setSite("http://10.241.0.188:8080/auth/realms/demo")
            .setTenant("demo")
            .setClientID(resource)
            .setClientSecret(credentials))
    
    .onSuccess(oauth2 -> {
        OAuth2AuthHandler test = OAuth2AuthHandler.create(vertx,oauth2)
            .setupCallback(router.get("/callback"));
        
        router.route("/private/*").handler(test);    
        
        router.route("/private*").handler(ctx -> {
            ctx.response().sendFile("/home/Documents/private_page.html");
            });   
       
        router.route("/").handler(ctx -> {
            ctx.response().sendFile(index);
            });           
        
        router.route("/webroot/*").handler(StaticHandler.create("webroot"));
        
        router.route("/logout").handler(context -> {
            AccessToken user = (AccessToken) context.user();
            user.logout(res -> {
              if (res.succeeded()) {
                  context.clearUser();
                  context.session().destroy();
                  context.response().putHeader("location", "/").setStatusCode(302).end();
                    // the logout call succeeded
                  } else {
                    // the user might not have been logged out
                    // to know why:
                    System.err.println(res.cause());
                  }             
              });               
          });
        vertx.createHttpServer().requestHandler(router).listen(listeningPort);
    });   
}

}

有了 vert.x 4.x,安全模块得到了改进,User 对象现在是通用的,不需要为特定提供者自定义 class 强制转换.

这意味着该示例正在尝试使用已弃用的代码,因此应该针对新的 API.

进行更新

此外,Vert.x4.x也改进了对Oauth2 + OpenId Connect标准的支持,现在支持官方结束会话url而不是像它那样依赖非标准特性曾经与:AccessToken.logout().

因此,要执行注销,您现在只需要做:

router.route("/logout")
  .handler(ctxt -> {
    // clear the session
    ctx.session().destroy();
    // use the oauth2/oidc end session url to signal the logout
    ctx.redirect(oauth2.endSessionURL(ctx.user()));
  });