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

在Vert.x中获取用户并验证JWT令牌

公良照
2023-03-14

我已经建立了一个keycloak服务器,我正在开发一个API,这将在互联网上。API将接收第三方(客户端)的调用。这些客户机将首先使用clientId和secret调用keycloak服务器以获取令牌,然后使用此令牌调用我的API。

{"Authorization":"Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJGSjg2R2NGM2pUYk5MT2NvNE52WmtVQ0lVbWZZQ3FvcXRPUWVNZmJoTmxFIn0.eyJqdGkiOiI2YWZlZjBiMC03ZmQ1LTRiOWUtOTk3NC0yOGFjMzBkMGM5OWQiLCJleHAiOjE0OTU2MTA0NTQsIm5iZiI6MCwiaWF0IjoxNDk1NjEwMTU0LCJpc3MiOiJodHRwOi8vMTI3LjAuMC4xOjgxMDAvYXV0aC9yZWFsbXMvZXhhbXBsZSIsImF1ZCI6ImpzLWNvbnNvbGUiLCJzdWIiOiJjNGY4NjE0Zi02YjFlLTRlYjItYmYxZC0wOTJmNGYxNWQwYmIiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJqcy1jb25zb2xlIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiNTQ4NDJjNTgtMzYxYi00MDk2LThhNjgtNGZkZTg5OGUwNzg5IiwiYWNyIjoiMSIsImNsaWVudF9zZXNzaW9uIjoiNDNjMWEzMjAtNGZmNi00NmRmLThmZjUtNTU2ZjgxNGZhYzk1IiwiYWxsb3dlZC1vcmlnaW5zIjpbXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbInVzZXIiXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJuYW1lIjoiU2FtcGxlIFVzZXIiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ1c2VyIiwiZ2l2ZW5fbmFtZSI6IlNhbXBsZSIsImZhbWlseV9uYW1lIjoiVXNlciIsImVtYWlsIjoic2FtcGxlLXVzZXJAZXhhbXBsZSJ9.n1K0KIGYJYPZkjSq1eSg5gWnCAj44mgl4M-GJOlzgCj8y5TGw5OhT7sr84o9Ja9K6WMW3t0ti6feZIgc8mps3RK0HuuXeCNcrN6H2dPEtBphTvfXEUR2iMg83iCmxjhXgXso7oX2vyreJqB6WCCFEPbAQH2e5kHZqv6cfmXRlYU"}
    null

我现在看到的是一个示例,它设置了一个JWTAuthHandler

    JWTAuth authProvider = JWTAuth.create(vertx, config().getJsonObject("keycloak.oidc"));
    router.route("/protected/*").handler(JWTAuthHandler.create(authProvider));

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

来自我的API(用于JWTAuth)的调用的Keycloak配置是:

   "keycloak.oidc": {
    "realm": "myrealm",
    "auth-server-url": "http://localhost:8100/auth",
    "ssl-required": "none",
    "resource": "app-client",
    "public-client": true
}

当我在postman中进行rest调用时,jvm并没有真正进入处理程序并记录头部,而是立即抛出这个异常:io.vertx.ext.web.handler.impl.jwtauthHandlerImpl avertissement:JWT decode failure java.lang.runtimeException:segments不足或太多

共有1个答案

乐正瑞
2023-03-14

如果我没有理解错的话,您有一个API来发出一个标题中带有JWT的请求。

在这种情况下,您不应该使用OAuth2处理程序,而应该使用JWT处理程序。此处理程序可与来自KeyCloak的只读令牌一起使用。

与其他Auth处理程序一样,如果请求通过验证,您将获得一个User对象,这一点非常重要。此对象可用于执行授权断言。或者,如果您对令牌的原始JSON表示感兴趣,可以将其理解为:

JsonObject token=context.user().principal();

在那里你可以随意检查它。

 类似资料:
  • 后端服务器有一个endpoint,在ping时提供JSON响应,并受Apigee边缘代理的保护。目前,该endpoint没有安全性,我们希望为发出请求的所有客户端实现仅承载令牌身份验证。所有向API发出请求的客户端都将在授权承载中发送JWT令牌,Apigee Edge将用于验证JWT令牌。 我如何使用keydape生成这个JWT令牌? 此外,Apigee还需要一个JWT令牌来源的公钥(签署JWT令

  • 我有一个Rest Spring BootAPI,当用户验证API返回令牌jwt时,我在浏览器中注意到该令牌出现在响应头中 如何通过Reactjs将此令牌存储在本地存储浏览器中? 我的请求代码如下所示:

  • 各位程序员, 我目前正在努力解决Web Api 2中的微软账户JWT令牌验证问题。我已经找到了OWIN中间件。Owin.Security.Jwt)下面是我的Startup.cs配置的代码: 我在这里找到了这个片段: http://code.lawrab.com/2014/01/securing-webapi-with-live-id.html JWT令牌使用Live SDK从我的Windows应用

  • 我在我的nodejs应用程序中为注册用户在keybeat上实现了keybeat,我使用的登录API是: 如果用户名和密码正确,则返回登录用户的令牌, 现在我需要传递这个令牌(通过上面的API返回),并检查这个令牌是否正确,如果令牌正确,我需要用户详细信息,是否有用于此的API。 提前谢谢

  • 在我的Jitsi Meet Prodody配置文件中:~/。jitsi meet cfg/prosody/config/conf.d 我有以下配置: 有了它,我可以通过令牌进行身份验证。 但是,如果我不指定任何令牌,例如: https://jitsi.mydummyserver.com/test 然后我得到以下提示询问用户和密码: 有没有办法只允许令牌身份验证并完全摆脱那个提示? 谢谢

  • 我目前正在使用Vapor开发Swift后端。我的iOS客户端使用新的iOS 13功能“使用Apple登录”。当用户登录时,我会得到一个身份令牌(访问令牌),这是一个由Apple签名的有效JWT令牌。这将在所有正在进行的通信中发送到服务器,以验证服务器提供的某些路由。 在服务器上,我想通过验证令牌签名来验证发送的令牌是否确实由Apple签名,并且不是由某些恶意用户专门创建的。Apple提供了一个HT