当前位置: 首页 > 知识库问答 >
问题:

Vert.x JWT段数不足或太多

孔彭祖
2023-03-14

当我的应用程序从前端应用程序接收到JWT令牌时,我不断收到一个错误,前端应用程序正在通过Keycloak进行身份验证。我得到的错误是“不够或太多段”。据我所知,该令牌是一个有效的令牌,应该能够被验证,但我无法通过这个非常通用的错误。有人能帮我看看我做错了什么吗?

下面是正在失败的相关代码片段。请注意,在运行我的测试用例时,相同的代码可以正常工作,这些测试用例使用Vert.x JWTAuth提供程序生成一个令牌:

JWTAuth authProvider = JWTAuth.create(vertx, new JWTAuthOptions(new JsonObject()
    .put("permissionsClaimKey", "realm_access/roles")
    .put("pubSecKeys", new JsonObject()
            .put("publicKey", "vcVtWG5Qcz9gTMrDPfJSWNAiXsyCyBmNIzjtfHhBDX-l60KHyFaGBGBjRNkzDysV6pr6drQR8zRD8ePo8q73KDbXlZohXkR_J-gXer8H5EyWGl7KAATmKvuiYYv89f_C6f3NYUgfyKn6wzUtlsZN1CYpGmbnfLZYUcGzwvWWkddqQUroRrsf305Z17Pioegd_JMhcdprC1caOCuJHe46bYlu4_9m_MSPvBUCqjqAUIDZpB8HT9xrwxlwKG_Er6l-7TvQ32jp0wPxitLpEUg9noAt5w2NXIX44PCSkOdtGxGpj7fhyfivi_HQEfTq3Y4N2BRWAQxXYRaHlgl08CIsLb5rgJXmh8O7506V0THyLcJZ3pTn0u_4KxedOTsEbM_07W8kNCXVQrTIn4Zkyz42geRfblAzjvScP962DzEqu28WVZXWUyJIeQA_z3UM0l-MpQFtFDHsb0inQdeBfA6IN_eRp-JZaoMKLfswUEXjEj6nytKnwOEaqdqq56uPPK1j7QorIjMyn9VztH1WbbWM_JNPNc5CDAjFxo54tvrzqKkxLNbR1lP8g5GbIBeGSRc36IXQEp2hV42i3Pu-7bPJ_E0m9vr5dePjeRotthDUR7osmhOlzqHrLq1uzUYYneK37j7lLMx7N67rkWWMBa3v0h57pVD9ufAd-BxHiQzZL2U")
            .put("type", "RS256"))));

...

versionOneAPI.route().handler(ctx -> {
    String authHeader = ctx.request().getHeader("Authorization");
    String encodedToken = authHeader.substring(authHeader.indexOf(' ')+1);
    LOGGER.debug("Got the token {}", encodedToken);
    authProvider.authenticate(new JsonObject().put("jwt", encodedToken), res -> {
        LOGGER.debug("Request received for: {}", ctx.request().path());
        if (res.succeeded()) {
            LOGGER.debug("Got the user {} from the token", res.result().principal().getString("name"));
            ctx.setUser(res.result());
            ctx.response().putHeader(CONTENT_TYPE, APPLICATION_JSON.toString());
            ctx.next();
        }
        else {
            LOGGER.error("Failed to parse token with {} segments", encodedToken.split("\\.").length, res.cause());
            ctx.response().setStatusCode(UNAUTHORIZED.code()).setStatusMessage(UNAUTHORIZED.reasonPhrase()).end();
        }
    });
});

下面是显示故障的日志示例:

共有1个答案

薛寒
2023-03-14

问题是配置JSON不正确它应该是:

JWTAuth authProvider = JWTAuth.create(vertx, new JWTAuthOptions(new JsonObject()
.put("permissionsClaimKey", "realm_access/roles")
.put("pubSecKeys", new JsonArray()
   .add(new JsonObject()
      .put("publicKey", "...")
      .put("type", "RS256")))));

pubseckeys是一个对象数组。为了更安全,您可能不应该使用JSON配置,而应该使用类型化配置。

 类似资料:
  • 我有以下规则: 所以基本上,我希望经过身份验证的用户能够读/写和集合。但当我创建一个用户并登录时,我会尝试写: 但我有一个错误: 不知道我做错了什么。任何帮助都将不胜感激——谢谢!

  • 我使用的是Role(允许读,写:如果request.auth.uid!=null),当我登录时,我得到的数据是ok的,但当我注销用户时,我得到的错误是:缺少或不充分的权限。首先,我认为这是因为我没有取消订阅我尝试的可观察的(rxjs/operator/takewhile)即使我使用异步管道,我也得到了同样的错误。

  • 问题内容: 假设我有一千个键,并且我想存储关联的值。直观的方法似乎像 对于Elasticsearch索引具有数千个键来说,这是一种不良的设计模式吗?以这种方式引入的每个键都会为索引下的每个文档增加开销吗? 问题答案: 如果您知道键数有上限,那么几千个字段就不成问题。 问题是当您拥有一组无限制的键时,例如,当键是从一个值派生时,因为您将拥有一个不断增长的映射关系以及簇状态。它还可能导致奇怪的搜索。

  • 使用以下安全规则: 我的应用程序似乎使用进行了正确的身份验证,因为返回正确的用户ID。 我是不是做错了什么?

  • 使用Quasar和Firebase的Im 我得到FireBaseError:缺少或权限不足。控制台错误 错误 脚本: 每当我把 发生缺少权限的情况 但当我移除绑定时,它没有错误 但我想在字段中获取username:值并将其放在我的导航上 firebase-用户名 但我不能得到它除非我移除 同样,当我移除它时,丢失权限的情况再次发生。 我该怎么办 整个代码: