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
吗?
经过一番讨论,您似乎有两个选择:
根据要求通过 @RequestParam
实施和端点并挖掘 Auth header。从那里,您可以通过 RestTemplate
将其重新添加到下游服务的后续出站请求中。
使用 Zuul 代理您的请求(包括 Auth header,确保它从 sensitive-headers
配置中排除)并实施预过滤器以包含您可能需要的任何其他逻辑需要。
如果非要我选的话,这听起来像是 Zuul 应该做的事情,因为它很可能充当您的 queue 和其他服务的网关,而且看起来您正在尝试实施代理请求,Zuul 已经可以做到,但是在不了解架构的全部范围的情况下很难说。
如何使用授权令牌正确实现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
吗?
经过一番讨论,您似乎有两个选择:
根据要求通过
@RequestParam
实施和端点并挖掘 Auth header。从那里,您可以通过RestTemplate
将其重新添加到下游服务的后续出站请求中。使用 Zuul 代理您的请求(包括 Auth header,确保它从
sensitive-headers
配置中排除)并实施预过滤器以包含您可能需要的任何其他逻辑需要。
如果非要我选的话,这听起来像是 Zuul 应该做的事情,因为它很可能充当您的 queue 和其他服务的网关,而且看起来您正在尝试实施代理请求,Zuul 已经可以做到,但是在不了解架构的全部范围的情况下很难说。