Я создал небольшой auth-сервер vertx, который подписывает / генерирует токены 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 от клиента, я получаю токен JWT назадподписано с моего auth-сервера выше.однако у меня есть несколько открытых вопросов:
- Как сервер аутентификации проверяет наличие у клиента открытого ключа сервера и является ли он подлинным?
- Как клиент может отправить открытый ключ серверу авторизации?
- Как сделать / api / new-token безопасным, чтобы к нему мог подключиться только законный клиент?