JWT 中的握手 public/private 使用 vertx 的密钥身份验证
Handshake in JWT public/private key authentication using vertx
我创建了一个小型 vertx 身份验证服务器,其中 signs/generates JWT 令牌使用 public/private 密钥。
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 如何确保客户端拥有服务器 public 密钥并且它是真实的?
- 客户端如何发送 public 密钥到授权服务器?
- 如何使 /api/new-token 安全,以便只有合法客户端才能连接到它?
您为什么不将此任务委派给 KeyCloak
开源身份和访问管理。它将身份验证添加到您的应用程序并以最少的麻烦保护服务。
我们已经在我们的项目中使用它并且效果很好!
要用 Vert.x 插入它,您可以遵循这些教程:
我创建了一个小型 vertx 身份验证服务器,其中 signs/generates JWT 令牌使用 public/private 密钥。
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 如何确保客户端拥有服务器 public 密钥并且它是真实的?
- 客户端如何发送 public 密钥到授权服务器?
- 如何使 /api/new-token 安全,以便只有合法客户端才能连接到它?
您为什么不将此任务委派给 KeyCloak
开源身份和访问管理。它将身份验证添加到您的应用程序并以最少的麻烦保护服务。
我们已经在我们的项目中使用它并且效果很好!
要用 Vert.x 插入它,您可以遵循这些教程: