6

在我们最后一个 feign 客户端安全配置中,我们有这个 Bean:

    @Bean
    public RequestInterceptor oauth2FeignRequestInterceptor(
            ClientCredentialsResourceDetails oauth2RemoteResource) {
        return new OAuth2FeignRequestInterceptor(
                new DefaultOAuth2ClientContext(),
                oauth2RemoteResource
        );
    }

在 2.3 春季版OAuth2FeignRequestInterceptor已弃用!但是我们找不到新的。

有人知道吗?

4

2 回答 2

1

您可以创建自己的 RequestInterceptor 来添加 Authorization 标头。

这里有一个例子: https ://developer.okta.com/blog/2018/02/13/secure-spring-microservices-with-oauth

于 2020-11-10T15:37:12.013 回答
0

我遇到了同样的问题,我需要一个请求拦截器来通过 Feign 客户端调用另一个微服务。

这个想法很简单,我唯一需要实现的是一个自定义的 RequestInterceptor,它使用 @Component 将当前的 JWT 从安全上下文注入到授权头中。

您可以按如下方式查看此组件:

@Component
@Slf4j
public class FeignClientInterceptor implements RequestInterceptor {

    private static final String AUTHORIZATION_HEADER = "Authorization";
    private static final String TOKEN_TYPE = "Bearer";

    @Override
    public void apply(RequestTemplate requestTemplate) {
        log.debug("FeignClientInterceptor -> apply CALLED");
        final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null && authentication instanceof JwtAuthenticationToken) {
            final JwtAuthenticationToken jwtAuthToken = (JwtAuthenticationToken) authentication;
            requestTemplate.header(AUTHORIZATION_HEADER, String.format("%s %s", TOKEN_TYPE, jwtAuthToken.getToken().getTokenValue()));
        }
    }

}

接下来就可以成功使用feign客户端了

    final APIResponse<ProcessedFileDTO> response = filesMetadataClient.getProcessedFileByName(uploadFile.getOriginalFilename());

    if (response.getStatus() == ResponseStatusEnum.ERROR
            && response.getHttpStatusCode() == HttpStatus.NOT_FOUND) {
        sendFileToSftp(uploadFile);
    } else {
        throw new FileAlreadyProcessedException();
    }
于 2020-12-20T13:38:52.240 回答