如何从请求添加当前访问令牌以假装调用另一个微服务

问题描述 投票:0回答:1

因此,当用户(客户端)通过网关发送请求时,它会转到安全服务,该服务还调用另一个在其调用中受到保护的服务。 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);
}

在此,我如何添加当前的访问令牌,如果呼叫是计划的并且令牌过期怎么办?

java spring spring-boot keycloak spring-cloud-feign
1个回答
0
投票

我会这样解决这个问题

  1. 使用像示例中那样的请求拦截器。只需使用不记名令牌填充“身份验证”标头即可:
@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();
  }

}
  1. 然后就可以直接在feign客户端设置token了

feignClient.setBearerToken(authToken);

  1. 然后您可以将令牌作为请求参数传递,如下所示:
@GetMapping("/api?access_token={token}")
String getData(@Param("token") String token);

现在对于令牌可能过期的计划任务,您需要在进行 Feign 调用之前刷新令牌。您可以使用

OAuth2RefreshTokenGrant
获取新的访问令牌。 我想说看一下 OAuth 2.0 客户端凭证流程,该流程使用没有过期时间的令牌来进行微服务到微服务的调用。

--希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.