因此,当用户(客户端)通过网关发送请求时,它会转到安全服务,该服务还调用另一个在其调用中受到保护的服务。 iv 通过 oauth 设置安全性并使用 feign 接口发送对此服务的调用,并且需要添加包含访问令牌的标头。我尝试了很多方法,但那里的所有课程似乎都已被弃用。请帮助我
@Component
@Data
public class UserContextFeignInterceptor implements RequestInterceptor { //adds interceptor to feign clients
@Override
public void apply(RequestTemplate template) {
template.header("tmx-correlation-id", UserContextHolder.getContext().getCorrelationId());
template.header("tmx-auth-token", UserContextHolder.getContext().getAuthToken());
template.header("tmx-user-id", UserContextHolder.getContext().getUserId());
template.header("tmx-organization-id", UserContextHolder.getContext().getOrganizationId());
template.header("Authentication",);
}
}
@FeignClient(name = "organization-service", configuration = FeignConfiguration.class) //add the config of which interceptor to use
public interface OrganizationFeignClient {
@LoadBalanced//spring cloud load balancer(client side)
@GetMapping("v1/organization/{organizationId}")
Organization getOrganization(@PathVariable("organizationId") String organizationId);
}
在此,我如何添加当前的访问令牌,如果呼叫是计划的并且令牌过期怎么办?
我会这样解决这个问题
@Component
public class AuthInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
template.header("Authorization", "Bearer " + authToken);
}
}
然后配置你的 Feign 客户端来使用这个拦截器:
@FeignClient(name = "service", configuration = FeignConfig.class)
public interface Client {
@GetMapping("/api")
String getData();
}
@Configuration
public class FeignConfig {
@Bean
public AuthInterceptor authInterceptor() {
return new AuthInterceptor();
}
}
feignClient.setBearerToken(authToken);
@GetMapping("/api?access_token={token}")
String getData(@Param("token") String token);
现在对于令牌可能过期的计划任务,您需要在进行 Feign 调用之前刷新令牌。您可以使用
OAuth2RefreshTokenGrant
获取新的访问令牌。
我想说看一下 OAuth 2.0 客户端凭证流程,该流程使用没有过期时间的令牌来进行微服务到微服务的调用。
--希望这有帮助