首页 文章

Spring Cloud RestTemplate添加身份验证令牌

提问于
浏览
1

如何使用授权令牌正确实现restTemplate?

我有一个Zuul网关,它正确地将JWT下游传递给其他服务,假设我不想先在网关上做任何事情,使用如下配置:

zuul:
  sensitive-headers:
  routes:
    instance-service:
      path: /instances/**
      strip-prefix: false

并使用令牌中继过滤器:

@Component
public class TokenRelayFilter extends ZuulFilter {

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        Set<String> headers = (Set<String>) ctx.get("ignoredHeaders");
        headers.remove("authorization");

        return null;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 10000;
    }
}

这只是将一切转发给实例服务,是一种享受 .

但是,如果我从config.yml文件中删除 routes 配置,因为我想在手动调用服务之前处理网关上的一些事情,我会松开访问令牌并从下游服务获得401

@ApiOperation(value = "List all instances and their properties.")
@GetMapping("/instances")
public ResponseEntity<String> instances() {
    ParameterizedTypeReference<String> reference = new ParameterizedTypeReference<String>() {
    };

    return restTemplate.exchange("http://instance-service", HttpMethod.GET, null, reference);
}

我的 RestTemplate 一般都是连线的

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

如何在不必在每个请求中手动创建和添加标头的情况下,将JWT正确地重新放入新的RestTemplate?

我应该使用 OAuth2RestTemplate 吗?

1 回答

  • 1

    经过一番讨论,看起来你有两个选择:

    • 实现和 endpoints 并根据请求通过 @RequestParam 挖掘Auth标头 . 从那里,您可以通过 RestTemplate 将后续出站请求重新添加到您的下游服务中 .

    • 使用Zuul代理您的请求(包括Auth标头,确保将其排除在 sensitive-headers 配置之外)并实施预过滤器以包含您可能需要的任何其他逻辑 .

    如果我必须选择,这听起来像Zuul应该做的事情,因为它可能充当你的队列和其他服务的网关,看起来你正在尝试实现代理请求,Zuul已经可以做了,但它是很难说不知道架构的全部范围 .

相关问题