Spring Boot项目中实现OAuth2客户端模式(Client Credentials Grant Type)

背景

在项目中难免需要和外部系统进行对接,既然对接那就需要进行鉴权认证,一般外围系统的对接交互方式协议分两种:https和内网;如果是https,有些场景也需要进一步进行接口层面的鉴权认证,虽然通道已经进行了保障了

OAuth2基础知识

在学习本篇OAuth2的客户端模式认证之前,大家需要先了解OAuth2几种认证模式,分别使用场景
【OAuth2】详细讲解

OAuth2场景的认证模式:验证码和客户端
springboot整合支付宝第三方授权登录代码实现详细教程
20220419_SpringBoot-OAuth2-Gitee第三方登录
上面是博主认为比较有学习价值的学习视频,讲的比较清楚,可以深入了解验证码认证的过程
本篇主要讲客户端模式,其实客户端模式不属于OAuth2的范畴,因为没有了用户,但是有客户端id,所以也纳入了OAuth2范畴

OAuth2客户端认证

在Spring Boot项目中实现OAuth2客户端模式(Client Credentials Grant Type)对第三方接口进行认证,通常涉及以下几个步骤:

设置OAuth2服务提供商:你需要有一个支持OAuth2的服务提供商,该服务提供商能够颁发访问令牌(Access Token)。如果你自己控制服务提供商,那么你需要设置好OAuth2服务器端。
客户端应用程序配置:在客户端应用程序中配置OAuth2客户端凭证,包括客户端ID (client_id) 和客户端密钥 (client_secret)。
获取访问令牌:使用客户端凭证向OAuth2授权服务器请求访问令牌。
使用访问令牌访问资源:获取到访问令牌之后,将其添加到请求头中,用于访问受保护的资源。

客户端服务搭建

下面是一个简单的示例,展示如何在Spring Boot项目中实现OAuth2客户端模式认证,并调用受保护的资源API。

添加依赖

首先,确保你的Spring Boot项目中包含了Spring Security OAuth2相关依赖:

<!-- 在pom.xml中添加 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

配置application.properties或application.yml

在application.properties或application.yml中配置OAuth2客户端信息:

# application.properties
spring.security.oauth2.client.provider.custom_oauth2.token-uri=http://your-oauth2-server.com/oauth/token
spring.security.oauth2.client.provider.custom_oauth2.authorization-uri=http://your-oauth2-server.com/oauth/authorize
spring.security.oauth2.client.provider.custom_oauth2.user-name-attribute=id

spring.security.oauth2.client.registration.custom_oauth2.client-id=your_client_id
spring.security.oauth2.client.registration.custom_oauth2.client-secret=your_client_secret
spring.security.oauth2.client.registration.custom_oauth2.scope=read,write
spring.security.oauth2.client.registration.custom_oauth2.authorization-grant-type=client_credentials
spring.security.oauth2.client.registration.custom_oauth2.redirect-uri-template=https://your-app.com/login/oauth2/code/custom_oauth2

创建OAuth2客户端配置

你可以创建一个配置类来指定OAuth2客户端的细节

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.server.SecurityWebFilterChain;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;

@EnableWebFluxSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        http
            .authorizeExchange()
                .anyExchange().authenticated()
                .and()
            .oauth2Login(); // 启用OAuth2登录
            
        return http.build();
    }
}

调用受保护资源

一旦获取到了访问令牌,你可以在HTTP请求头中包含Authorization字段,值为Bearer {access_token},来访问受保护的资源:

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

public class ResourceFetcher {

    public void fetchResource(String accessToken) {
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(accessToken); // 设置Bearer Token
        HttpEntity<String> entity = new HttpEntity<>("body", headers);

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.exchange(
            "http://protected-resource.com/api/resource",
            HttpMethod.GET,
            entity,
            String.class
        );
Spring Boot,使用`spring-boot-starter-oauth2-client`配置`SecurityFilterChain`可以实现OAuth2客户端认证和授权功能。下面是配置`SecurityFilterChain`的步骤: 1. 首先,在`application.properties`或`application.yml`文件配置OAuth2客户端的相关属性,例如: ``` spring.security.oauth2.client.registration.<client-id>.client-id=<client-id> spring.security.oauth2.client.registration.<client-id>.client-secret=<client-secret> spring.security.oauth2.client.registration.<client-id>.redirect-uri=<redirect-uri> spring.security.oauth2.client.registration.<client-id>.authorization-grant-type=authorization_code spring.security.oauth2.client.registration.<client-id>.scope=<scope> spring.security.oauth2.client.provider.<provider-id>.authorization-uri=<authorization-uri> spring.security.oauth2.client.provider.<provider-id>.token-uri=<token-uri> spring.security.oauth2.client.provider.<provider-id>.user-info-uri=<user-info-uri> ``` 2. 创建一个`@Configuration`类,并使用`@EnableWebSecurity`注解启用Web安全功能。 3. 在该配置类,创建一个实现`SecurityFilterChain`接口的`@Bean`方法,并使用`HttpSecurity`对象进行配置,例如: ```java @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeRequests(authorizeRequests -> authorizeRequests .antMatchers("/login").permitAll() .anyRequest().authenticated() ) .oauth2Login(); return http.build(); } } ``` 4. 在上述配置,使用`authorizeRequests`方法配置请求的授权规则,例如使用`antMatchers`方法指定某些URL的访问权限,使用`anyRequest`方法指定其他请求的访问权限。 5. 使用`oauth2Login`方法启用OAuth2登录功能,该方法会自动配置OAuth2客户端的登录流程。 6. 最后,将上述配置类添加到Spring Boot应用程序的启动类上,例如: ```java @SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值