【RestTemplate】RestTemplate访问需要OAuth2授权的服务

RestTemplate访问需要OAuth2授权的服务

概述

随着微服务安全性的增强,需要携带token才能访问其API,然而RestTemplate默认并不会将 token 放到 Header 中,那么如何使用RestTemplate实现自动设置授权信息并访问需要OAuth2授权的服务呢?

本文重点讲述如何通过OAuth2RestTemplate实现自动设置授权信息,并访问需要OAuth2的client模式授权的服务。需要重点理解下面两点:

  • OAuth2.0配置
  • OAuth2RestTemplate

本文依赖:

  • spring-boot-starter-parent:2.4.2
  • spring-cloud-starter-oauth2:2.2.4.RELEASE

示例

OAuth2.0相关配置

引入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
    <version>2.2.4.RELEASE</version>
</dependency>
配置application.yml
security:
  oauth2:
    client:
      client-id: car-client
      client-secret: 123456
      grant-type: authorization_code #client_credentials
      user-authorization-uri: ${auth.service}/oauth/authorize #请求认证的地址
      access-token-uri: ${auth.service}/oauth/token #请求令牌的地址
      pre-established-redirect-uri: ${client.service}/callback
      scope:
        - all

auth.service: http://localhost:8080
client.service: http://localhost:8091

OAuth2RestTemplate

编写OAuth2RestTemplateConfiguration(重点)
@Configuration
public class OAuth2RestTemplateConfiguration {

    @Resource
    private ClientCredentialsResourceDetails clientCredentialsResourceDetails;

    @Bean
    public OAuth2RestTemplate clientCredentialsRestTemplate() {
        return new OAuth2RestTemplate(clientCredentialsResourceDetails);
    }

    @Bean
    @ConfigurationProperties("security.oauth2.client")
    //@ConfigurationProperties("spring.security.oauth2.client.registration.github")
    public AuthorizationCodeResourceDetails google() {
        return new AuthorizationCodeResourceDetails();
    }

    @Bean
    public OAuth2RestTemplate authorizationCodeRestTemplate(AuthorizationCodeResourceDetails authorizationCodeResourceDetails) {
        return new OAuth2RestTemplate(clientCredentialsResourceDetails);
    }
}

拓展

RestTemplate访问需要Basic授权的服务

RestTemplate restTemplate = new RestTemplate();
restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor("username", "password"));

或者

RestTemplate restTemplate = new RestTemplateBuilder().basicAuthentication("username", "password").build();

参考

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OAuth2是一种授权协议,用于保护API和应用程序。RestTemplate是Spring框架提供的一个用于发送HTTP请求的工具类。使用RestTemplate调用OAuth2授权服务涉及到以下步骤: 1. 获取访问令牌(access token):在OAuth2授权流程中,客户端需要授权服务器发送请求,获取访问令牌。这个过程需要传递客户端ID和密钥等信息。可以使用RestTemplate发送HTTP请求来实现这个过程。 2. 使用访问令牌访问受保护的资源:获取访问令牌之后,客户端可以使用这个令牌访问OAuth2保护的资源。在访问这些资源时,客户端需要在HTTP请求头中传递访问令牌。同样可以使用RestTemplate发送HTTP请求来实现这个过程。 下面是一个使用RestTemplate调用OAuth2授权服务的示例: ``` // 创建RestTemplate实例 RestTemplate restTemplate = new RestTemplate(); // 发送获取访问令牌的请求 String url = "http://oauthserver.com/token"; MultiValueMap<String, String> params = new LinkedMultiValueMap<>(); params.add("grant_type", "client_credentials"); params.add("client_id", "your_client_id"); params.add("client_secret", "your_client_secret"); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers); ResponseEntity<TokenResponse> response = restTemplate.postForEntity(url, request, TokenResponse.class); // 获取访问令牌 String accessToken = response.getBody().getAccessToken(); // 使用访问令牌访问受保护的资源 url = "http://protectedresource.com/api/v1/users"; headers = new HttpHeaders(); headers.setBearerAuth(accessToken); request = new HttpEntity<>(headers); response = restTemplate.exchange(url, HttpMethod.GET, request, UserListResponse.class); // 处理响应结果 List<User> userList = response.getBody().getUsers(); ``` 在这个示例中,我们首先创建了一个RestTemplate实例。然后,我们发送获取访问令牌的请求,使用postForEntity方法发送HTTP POST请求,传递授权服务器的URL、请求参数和请求头信息。在响应中,我们解析访问令牌,并将其存储在accessToken变量中。 接下来,我们使用RestTemplate访问受保护的资源。我们使用exchange方法发送HTTP GET请求,传递受保护资源的URL和请求头信息。在响应中,我们解析受保护资源的响应结果,并将其存储在userList变量中。 这是一个基本的示例,你可以根据实际需求进行修改和扩展。需要注意的是,这个示例中并没有处理访问令牌的过期和刷新等问题,你需要根据实际情况进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值