You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:52:40