如何在Vert.x REST服务中转发jwt令牌

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Vert.x REST服务中转发jwt令牌相关的知识,希望对你有一定的参考价值。

我有一个Vert.x REST服务,用jwt令牌接收请求,我想调用另一个REST服务传递收到的令牌。在路由器处理程序和WebClient调用之间,我有一个业务逻辑层。我的问题是,是否有一种方法为webClient提供令牌,而不是通过我的业务逻辑层显式传递它?换句话说,有可能以某种方式检索我的RoutingContext和令牌,例如, vertxContext还是其他组件?

示例代码演示了我想要实现的目标:

垂直卡斯

public class RestApiVerticle extends AbstractVerticle {

    businessLogicService service;

    @Override
    public void start() throws Exception {
        initService();

        HttpServer server = vertx.createHttpServer();
        Router router = Router.router(vertx);

        JWTAuth authProvider = JWTAuth.create(vertx, getAuthConfig());
        router.route("/*").handler(JWTAuthHandler.create(authProvider));

        router.route("/somePath").handler(this::handleRequest);

        server.requestHandler(router::accept).listen(config().getInteger("port"));
    }

    private void handleRequest(RoutingContext context){
        service.doSomeBusinessLogic(); //I could pass context here, but I thing this is not a proper way to do it, as business logic should not know about RequestContext
    }

    private void initService(){
        ExternalAPICaller caller = new ExternalAPICaller(WebClient.create(vertx));
        service = new BusinessLogicService(caller);
    }

    private JsonObject getAuthConfig() {
        return new JsonObject();
    }
}

BusinessLogicService:

public class BusinessLogicService {
    ExternalAPICaller caller;

    public BusinessLogicService(ExternalAPICaller caller){
        this.caller = caller;
    }

    public void doSomeBusinessLogic(){
        caller.doSth();
    }
}

ExternalAPICaller:

public class ExternalAPICaller {WebClient客户端;

public ExternalAPICaller(WebClient client){
    this.client = client;
}

public void doSth(){
    String TOKEN = null; // I would like to retrive here my token from some vertx component

    client.post("externalAPIpath")
        .putHeader("Authorization", "Bearer" + TOKEN)
        .send(ctx -> {
            //(..)
        });
}

}

答案

我的实现是在javascript(Node.js / Express)中,但我使用cookie将JWT发送到客户端。

res.cookie("auth", token);
return res.redirect(`http://localhost:3000/socialauthredirect`);
另一答案

当您调用do business逻辑方法时,您可以传递请求authorization标头值,因为它包含您未触及的jwt标记。然后在您的Web客户端上添加一个带有该值的标头,当然名为authorization,您的令牌将转发到下一个服务。

以上是关于如何在Vert.x REST服务中转发jwt令牌的主要内容,如果未能解决你的问题,请参考以下文章

Vert.x JWT 段数不够或太多

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

Spring Boot JWT - 如何实现刷新令牌和注销 REST-API

如何让 django-rest-framework-jwt 在注册时返回令牌?

如何在 Django 的单个 API 中获取访问令牌和刷新令牌(rest_framework_jwt)

如何在 django rest 框架中验证 jwt 身份验证中的令牌