前言
Spring Security 5中集成了OAuth的客户端模块,该模块包含以下三个子模块:
- spring-security-oauth2-core
OAuth授权框架和OIDC的核心数据结构及接口,被Client、 Resource Server和Authorization Server所依赖。
- spring-security-oauth2-jose
支持JOSE协议组,具体包含:JSON Web Token(JWT)、JSON Web Signature(JWS)、JSON Web Encryption(JWE)、JSON Web Key(JWK)。
- spring-security-oauth2-client
Spring Security支持OAuth和OIDC的客户端功能实现包。
实现GitHub快捷登录
源代码地址: https://github.com/jujunchen/21Study
新建工程
新创建一个Spring Boot 工程,pom依赖如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--单元测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
注意: 必须引入spring-boot-starter-oauth2-client
依赖
注册OAuth应用
在GitHub上注册一个OAuth应用
地址是:https://github.com/settings/applications/new
注册界面如下:
- Application name:必填,应用名称
- Homepage URL:必填,主页的URL地址,本地开发,我们将其设置为http://localhost:8080
- Application description:非必填,应用描述
- Authorization callback URL:必填,OAuth认证的重定向地址,本地开发环境设置为http://localhost:8080/login/oauth2/code/github
点击 Register application按钮注册,注册完成得到clientId和clientSecret
配置application.yml
接下来在配置文件中增加对于的配置
spring:
security:
oauth2:
client:
registration:
github:
client-id: github-client-id
client-secret: github-client-secret
其中:
(1)spring.security.oauth2.client.registration是OAuth客户端所有属性的基础前缀。
(2)registration下面的github是ClientRegistration的唯一ID。
Spring Security OAuth 默认的重定向模板是{baseUrl}/login/oauth2/code/{registrationId}
,registrationId
是ClientRegistration的唯一ID,通常以接入的OAuth服务提供商的简称来命名即可,所以此处设置为 github。
github-client-id和github-client-secret需要替换为前面在GitHub上注册得到的clientId和clientSecret。
新建Controller
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(Principal principal) {
return "Hello," + principal.getName();
}
}
principal对象由Spring框架自动注入,表示当前登录的用户。
演示
- 启动Spring Boot应用
- 访问http://localhost:8080/hello的时候,会跳转到github的登录页
- 点击Authorize xxx(授权)按钮后,回调到
http://localhost:8080/login/oauth2/code/github?code=dc3a0c2d3a77a8ade7dc&state=Pq69SdJxwxeV-nY4aLkX-DGu31qWNFl-5EMRml1sRdM%3D
地址,该地址就为前面配置的OAuth认证的重定向地址,code 和 state为 github 自动拼接。最终浏览器显示"Hello,xxx"
由于github在国内经常超时,后面将介绍如何使用Gitee进行集成登录。