如何使 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 只注入用户对象而不拒绝未经授权的请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 CompletableFuture 转换为 Vert.X Future