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()));
});
我目前正在将 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()));
});