问题描述
我目前正在使用带有 vertx 的 keyckloak,我正在尝试从我的应用程序注销,但我无法删除令牌。当我注销时,我仍然可以访问私人页面。你能给我一些建议吗?
这是我的代码:
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
对象现在是通用的,不需要为特定提供程序进行自定义类转换。
这意味着该示例正在尝试使用已弃用的代码,因此应针对新 API 对其进行更新。
此外,Vert.x 4.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()));
});