Netty调用第三方服务中的身份认证

1.问题.

第三方服务接口如下:

    @GetMapping("/courses_teachers")
    List<Course> getStudentCoursesAndTeachers(@RequestHeader String username)

因为第三方服务使用的OAuth2身份认证,所以除了username参数外,还需要请求头携带Authorization.

如果在controller里,使用Feign调用时会自动把HttpServletRequest的请求头信息加入进来.

Feign接口:

    @GetMapping("/courses_teachers")
    List<Course> getStudentCoursesAndTeachers(String username);

controller:

courseList = courseService.getStudentCoursesAndTeachers(username);

controller里feign调用时会携带前端的请求头,包括了Authorization,所以能够正常取得返回值;

 而非controller的netty handler进行feign调用,报错[401] during [GET] to xxx,[{"error": "unauthorized" , "error_ description": "FULL authentication is required to access this resource"}],由于feign接口的参数没有Authorization,所以netty handler无法通过第三方的身份认证.

2.方法.

        采用编程式远程调用,使用RestTemplate.

        先配置RestTemplate:

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;


@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate(@Qualifier("simpleClientHttpRequestFactory") ClientHttpRequestFactory factory){
        return new RestTemplate(factory);
    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        //设置连接超时
        factory.setConnectTimeout(15000);
        factory.setReadTimeout(5000);
        return factory;
    }
}

        在 netty handler里:

            //前端发来的socket消息里的token
            String token = message.getToken();

            //取得Spring IOC 容器里的restTemplate
            ApplicationContext applicationContext = SpringContextUtil.getApplicationContext();
            RestTemplate restTemplate = applicationContext.getBean(RestTemplate.class);

            HttpHeaders headers = new HttpHeaders();
            headers.add("Authorization", token);
            ResponseEntity<List> response = restTemplate.exchange(
                    "第三方服务接口url",
                    HttpMethod.GET,
                    new HttpEntity<String>(headers),
                    List.class
                    );
            List<LinkedHashMap> courseList = response.getBody();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值