Spring Cloud RestTemplate 添加授权令牌

Spring Cloud RestTemplate add auth token

如何使用授权令牌正确实现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;
    }
}

它只是将所有内容转发给 instance-service,非常有用。

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

@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 中,而不必在每个请求中手动创建和添加 header?

我应该使用 OAuth2RestTemplate 吗?

经过一番讨论,您似乎有两个选择:

  1. 根据要求通过 @RequestParam 实施和端点并挖掘 Auth header。从那里,您可以通过 RestTemplate 将其重新添加到下游服务的后续出站请求中。

  2. 使用 Zuul 代理您的请求(包括 Auth header,确保它从 sensitive-headers 配置中排除)并实施预过滤器以包含您可能需要的任何其他逻辑需要。

如果非要我选的话,这听起来像是 Zuul 应该做的事情,因为它很可能充当您的 queue 和其他服务的网关,而且看起来您正在尝试实施代理请求,Zuul 已经可以做到,但是在不了解架构的全部范围的情况下很难说。