vertx 中的 JWT 身份验证引发未经授权的行为

Posted

技术标签:

【中文标题】vertx 中的 JWT 身份验证引发未经授权的行为【英文标题】:JWT authentication in vertx throwing unauthorized 【发布时间】:2021-07-23 14:07:34 【问题描述】:

在我的应用程序中,我正在使用带有 keycloak 身份验证的反应。我正在尝试使用从 keycloak 接收到的令牌来保护我的后端 vertx API。 我关注了这个博客http://paulbakker.io/java/jwt-keycloak-angular2/

我是这样从 react 中调用的

    return await fetch('/api/getAuthentication',
        method: 'GET',
        headers: "Authorization" : `Bearer $token`
        )

在我的顶点侧

JsonObject authConfig = new JsonObject()
                    .put("public-key", "MyPublicKeyFromKeycloak")
                    .put("permissionsClaimKey", "realm_access/roles");        
            JWTAuth authProvider = JWTAuth.create(vertx, new JWTAuthOptions(authConfig));
            router.route("/api/*").handler(JWTAuthHandler.create(authProvider));

我尝试用下面的代码进行测试,

router.route("/api/getAuthentication").handler(ctx -> 
                logger.info("Headers: ", ctx.request().headers().get("Authorization"));
                logger.info(ctx.user().principal().encodePrettily());
            );

我看不到任何日志,在我的浏览器中响应是“未经授权”的 401 代码。

【问题讨论】:

你必须 end() 处理程序中某处的 RequestContext。否则不会被退回 @injecteer,它没有进入“/api/getAuthentication”处理程序。我已经尝试过 end(),还是一样,这就是为什么我看不到任何日志 【参考方案1】:

首先,JWTAuthOptions 不会对您在键 "public-key" 下设置的内容执行任何操作,因为它没有任何映射到它的属性(即使在 Java 中可能有一个 - 属性名称)。因此,要么直接使用设置器在 JWTAuthOptions 上设置您的值,要么咨询 documentation 以获得正确的键。

其次,如果您的 Keycloak 是使用 OIDC 设置的,那么您可以简单地使用 OpenIDConnectAuth 自动从 Keycloak 中发现必要参数的类。哪个更容易。

【讨论】:

,非常感谢。我尝试了第一个选项,它按预期工作

以上是关于vertx 中的 JWT 身份验证引发未经授权的行为的主要内容,如果未能解决你的问题,请参考以下文章

使用 JWT 进行护照身份验证:如何将护照的默认未经授权响应更改为我的自定义响应?

在刷新身份验证令牌时处理多个未经授权的请求

使用 vertx 在 JWT 公钥/私钥身份验证中握手

护照-jwt 401 未经授权

出现未经授权的错误:需要完全身份验证才能访问此资源

保护未经身份验证的 REST API