feign整合oauth2 使用笔记

  1. 编写配置类

    @Slf4j
    public class OAuth2FeignConfiguration {
    
        @Value("${auth.server.access-token-uri}")
        private String accessTokenUri;
        @Value("${auth.server.client-id}")
        private String clientId;
        @Value("${auth.server.client-secret}")
        private String clientSecret;
        @Value("${auth.server.host}")
        private String host;
    
        public OAuth2ClientContext oAuth2ClientContext = new DefaultOAuth2ClientContext();
    
        @Bean
        public ErrorDecoder errorDecoder() {
            return (methodKey, response) -> {
                if (response.status() == HttpStatus.UNAUTHORIZED.value()) {
                    oAuth2ClientContext.setAccessToken(null);
                    throw new RetryableException(response.status(), "access_token expire, retry", response.request().httpMethod(), new Date());
                }
                String message = response.reason();
                try {
                    message = IOUtils.toString(response.body().asInputStream(), StandardCharsets.UTF_8);
                } catch (IOException e) {
                    log.error("error decode error: {}", e);
                }
                return new RuntimeException("[" + methodKey + "], status: " + response.status() + ", message: " + message);
            };
        }
    
        @Bean
        public Retryer feignRetryer() {
            return new Retryer.Default(100, SECONDS.toMillis(1), 2);
        }
    
        @Bean
        RequestInterceptor oauth2FeignRequestInterceptor() {
     	   return new OAuth2FeignInterceptor(oAuth2ClientContext, resource(), host);
        }
        
        private ClientCredentialsResourceDetails resource() {
     	   ClientCredentialsResourceDetails resource = new ClientCredentialsResourceDetails();
     	   resource.setAccessTokenUri(accessTokenUri);
     	   resource.setClientId(clientId);
     	   resource.setClientSecret(clientSecret);
     	   return resource;
        }
    }
    
  2. 自定义:OAuth2FeignRequestInterceptor

    @Slf4j
    class OAuth2FeignInterceptor extends OAuth2FeignRequestInterceptor {
    
        private final String target;
    
        public OAuth2FeignInterceptor(OAuth2ClientContext oAuth2ClientContext, OAuth2ProtectedResourceDetails resource, String target) {
            super(oAuth2ClientContext, resource);
            this.target = target;
        }
    
        @Override
        public void apply(RequestTemplate template) {
            if (StringUtils.isNotEmpty(target)) {
                template.target(target);
            }
            super.apply(template);
        }
    }
    
  3. 编写测试类

    @FeignClient(
    	  name = "hello-service", 
    	  configuration = OAuth2FeignConfiguration.class
    )
    public interface HelloFeignClient {
    
        @GetMapping("/hello/index/{userId}")
        UserInfo index(@PathVariable("userId") String userId);
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值