如何使 Vert.x JWTAuthHandler 只注入用户对象而不拒绝未经授权的请求?

Posted

技术标签:

【中文标题】如何使 Vert.x JWTAuthHandler 只注入用户对象而不拒绝未经授权的请求?【英文标题】:How to make Vert.x JWTAuthHandler only injects the User object but not rejecting unauthorized request? 【发布时间】:2022-01-05 00:54:04 【问题描述】:

我的 API 根据用户是否提供授权有不同的逻辑。如果我只写 router.route(...).handler(Handler) ,即使请求提供授权,RoutingContext.user() 也总是返回 null ,但如果我写 router.route(...).handler(JWTAuthHandler.create(jwt)); router.route(...).handler(Handler) ,任何未经授权的请求都会立即被拒绝,未经授权的响应不会运行我的 API 逻辑。如果提供了授权,我怎样才能让它注入用户对象,但不拒绝请求?

【问题讨论】:

【参考方案1】:

如果Authorization 标头包含无效标记或根本不存在标记,JWTHandler 将停止执行。允许它继续会引入一个安全漏洞,因为这意味着任何令牌,无论是有效的还是伪造的,都会被接受。

我可以想象您可能希望在某些错误状态下进行恢复,在这种情况下,有一种方法可以处理这种情况。例如:

router.route()
  .handler(JWTAuthHandler.create(JWTAuth.create(vertx, new JWTAuthOptions())))
  .failureHandler(ctx -> 
    // recover and continue
    ctx.setUser(User.create(new JsonObject().put("name", "paulo")));
    ctx.reroute(ctx.normalizedPath());
  );

router.route()
  .handler(RoutingContext::end);

在您的恢复failureHandler 中,您必须设置自己的User 对象并调用重新路由,这将重新启动请求。鉴于上下文中已经存在 User,第二次,JWTAuthHandler 将跳过执行,并且刚刚结束请求的下一个处理程序以状态码 200 (OK) 完成

【讨论】:

以上是关于如何使 Vert.x JWTAuthHandler 只注入用户对象而不拒绝未经授权的请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Vert.x 实现非阻塞 REST Web 服务

Vert.x 响应式 Web 框架介绍使用

如何将 CompletableFuture 转换为 Vert.X Future

Vert.x 操作数据库

如何在 Vert.x (java) 中使用 Jackson 流式传输 JSON 结果

Vert.x 操作Redis