Vert.x JWT认证问题:已生成RSA签名JWT,端点安全实现受阻
Vert.x JWT端点认证实现方案
你已完成JWT Token生成逻辑,以下是实现端点安全认证的具体步骤:
一、添加JWT认证路由拦截器
利用Vert.x提供的JWTAuthHandler,为需要保护的端点添加Token校验逻辑:
// 注入你通过AuthConfig创建的JWTAuth实例 JWTAuth jwtAuth = ...; // 创建认证处理器 JWTAuthHandler authHandler = JWTAuthHandler.create(jwtAuth); // 初始化路由 Router router = Router.router(vertx); // 对指定路径启用认证,例如/api下的所有接口 router.route("/api/*").handler(authHandler);
二、自定义Token提取规则
默认处理器会从Authorization头读取Bearer <token>格式的Token,若需支持其他传递方式(如URL参数),可自定义提取逻辑:
authHandler.extractToken(request -> { // 优先从URL参数取token,再从请求头取 String token = request.getParam("token"); return token != null ? token : request.getHeader("Authorization"); });
三、定制认证失败响应
默认认证失败返回401状态码,你可以自定义响应内容:
authHandler.failureHandler(ctx -> { ctx.response() .setStatusCode(401) .putHeader("Content-Type", "application/json") .end(new JsonObject().put("error", "无效或过期的认证Token").encode()); });
四、校验自定义Claims
如果需要验证Token中的自定义字段(如你设置的message),可在认证后添加额外校验:
router.route("/api/*").handler(authHandler) .handler(ctx -> { // 获取Token中的所有Claims JsonObject claims = ctx.user().principal(); // 校验自定义字段 if (!"token-data".equals(claims.getString("message"))) { ctx.response().setStatusCode(403).end("无访问权限"); return; } // 继续处理业务请求 ctx.next(); });
五、修正现有代码中的问题
你的JWTBuilder中Header设置有误,正确的JWT Header应指定Token类型,而非Bearer:
// 修正后的buildToken方法 public String buildToken(String subject) { return jwtAuth.generateToken(new JsonObject() .put("message", "token-data"), new JWTOptions() .setHeader(new JsonObject().put("typ", "JWT")) // 设置Token类型为JWT .setSubject(subject) .setIssuer(issuer) .setAlgorithm(algorithm) .setExpiresInMinutes(2840)); }
你已完成的代码参考
AuthConfig
JWTAuthOptions options = new JWTAuthOptions() // 添加公钥 .addPubSecKey(new PubSecKeyOptions() .setAlgorithm(algorithm) .setBuffer("-----BEGIN PUBLIC KEY-----\n" + publicKey + // 替换为实际公钥字符串 "\n-----END PUBLIC KEY-----")) // 添加私钥 .addPubSecKey(new PubSecKeyOptions() .setAlgorithm(algorithm) .setBuffer("-----BEGIN PRIVATE KEY-----\n" + privateKey + // 替换为实际私钥字符串 "\n-----END PRIVATE KEY-----")); return JWTAuth.create(vertx, options);
JWTBuilder
public class JwtBuilderHandlerImpl { private final JWTAuth jwtAuth; private final String issuer; private final String algorithm; public JwtBuilderHandlerImpl(JWTAuth jwtAuth, String issuer, String algorithm) { this.jwtAuth = jwtAuth; this.issuer = issuer; this.algorithm = algorithm; } public String buildToken(String subject) { return jwtAuth.generateToken(new JsonObject() .put("message", "token-data"), new JWTOptions() .setHeader(new JsonObject().put("typ", "JWT")) .setSubject(subject) .setIssuer(issuer) .setAlgorithm(algorithm) .setExpiresInMinutes(2840)); } }
内容的提问来源于stack exchange,提问作者Plus Ultra
相关产品推荐
相关产品推荐

