java - 使用 vertx 在 JWT 公钥/私钥身份验证中握手
问题描述
我创建了一个小型 vertx auth-server,它使用公钥/私钥签名/生成 JWT 令牌。
PrivateKey privateKey = CertUtil.getPrivateKey("config/private_key.der");
PublicKey publicKey = CertUtil.getPublicKey("config/public_key.der");
// Create a JWT Auth Provider
JWTAuth jwt = JWTAuth.create(vertx, new JWTAuthOptions()
.setPubSecKeys(List.of(new PubSecKeyOptions()
.setAlgorithm("RS256")
.setPublicKey(Base64.getEncoder().encodeToString(publicKey.getEncoded()))
.setSecretKey(Base64.getEncoder().encodeToString(privateKey.getEncoded())))));
// protect the API
router.route("/api/*").handler(JWTAuthHandler.create(jwt, "/api/new-token"));
// this route is excluded from the auth handler
router.get("/api/new-token").handler(ctx -> this.generateAndSendToken(ctx, jwt));
// this is the secret API
router.get("/api/protected").handler(ctx -> {
ctx.response().putHeader("Content-Type", "text/plain");
ctx.response().end("a secret you should keep for yourself...");
});
vertx.createHttpServer().requestHandler(router).listen(8080);
现在,当我从客户端访问 /api/new-token 时,我会从上面的 auth-server 获得一个 JWT 令牌。但是我有一些悬而未决的问题:
- auth-server 如何确保客户端拥有服务器公钥并且是真实的?
- 客户端如何将公钥发送到 auth-server?
- 我怎样才能使 /api/new-token 安全,只有合法的客户端才能连接到它?
解决方案
为什么不将此任务委托给KeyCloak
开源身份和访问管理。它将身份验证添加到您的应用程序并以最小的麻烦保护服务。
我们已经在我们的项目中使用了它,并且效果很好!
要将其插入 Vert.x,您可以按照以下教程进行操作:
推荐阅读
- npm - 在 VSCODE 的不同终端中打开多个脚本的方法
- sql-server - SQL Server 2014 中的表中需要逗号分隔值
- java - ModelMapper 没有映射 Spring Entity 属性
- r - 通过查找模式 R 替换 data.frames 列表中的列名
- javascript - JavaScript FabricJs 将图像放到画布视图中
- c++ - 在 C++17 中迭代它时从 std::set 中删除一个元素
- matlab - 在MATLAB中,每次值从1变为0时如何在向量中查找索引?
- javafx - 复选框松开他的状态
- ios - 在 Swift 中单击 TextField 外部时如何在 TextField 中隐藏 TEXT?
- git - Git重命名并放弃分支