您现在的位置是:首页 >技术交流 >Spring Security实战(九)—— 使用Spring Security OAuth实现OAuth对接网站首页技术交流
Spring Security实战(九)—— 使用Spring Security OAuth实现OAuth对接
一、OAuth2.0介绍
OAuth2.0是一种授权协议,允许用户授权第三方应用程序代表他们获取受保护的资源,如个人信息或照片等。它允许用户授权访问他们存储在另一个服务提供商上的资源,而无需将其凭据共享给第三方应用程序。OAuth2.0协议建立在OAuth1.0协议之上,采用了更简单的流程和更广泛的支持,使得它成为了一种广泛应用的授权协议。
OAuth2.0协议的核心是授权服务器和资源服务器。授权服务器是一个服务,它允许用户授权第三方应用程序访问他们的资源。资源服务器是存储资源的服务提供商,例如云存储或社交媒体网站。OAuth2.0协议定义了四种授权方式:授权码授权、隐式授权、密码授权和客户端凭证授权。每种授权方式都有不同的用例和安全考虑因素。
OAuth2.0协议已被广泛采用,例如在社交媒体网站、电子邮件服务、云存储等各种应用程序中,以便为用户提供方便的授权和安全的访问控制。
OAuth2.0定义了四种授权模式,分别是授权码授权、隐式授权、密码授权和客户端凭证授权。
(1)授权码授权(Authorization Code Grant)
这种授权方式是最安全的一种授权方式,适用于需要长时间访问用户受保护资源的客户端。其流程如下:
- 客户端向授权服务器请求授权,授权服务器将用户重定向到登录页面。
- 用户输入用户名和密码,登录成功后,授权服务器将授权码发送给客户端。
- 客户端使用授权码向授权服务器请求访问令牌。
- 授权服务器验证授权码,并向客户端发放访问令牌和刷新令牌。
(2)隐式授权(Implicit Grant)
这种授权方式适用于一些需要短时间内访问用户受保护资源的客户端。其流程如下:
- 客户端向授权服务器请求授权,授权服务器将用户重定向到登录页面。
- 用户输入用户名和密码,登录成功后,授权服务器将访问令牌直接发送给客户端。
(3)密码授权(Resource Owner Password Credentials Grant)
这种授权方式适用于用户与客户端之间有一定信任关系,且客户端可以安全存储用户凭证。其流程如下:
- 客户端使用用户凭证向授权服务器请求访问令牌。
- 授权服务器验证用户凭证,并向客户端发放访问令牌和刷新令牌。
(4)客户端凭证授权(Client Credentials Grant)
这种授权方式适用于客户端需要访问自己拥有的资源的情况。其流程如下:
- 客户端使用自己的凭证向授权服务器请求访问令牌。
- 授权服务器验证客户端凭证,并向客户端发放访问令牌。
这四种授权方式各有优缺点,在选择授权方式时需要根据实际情况进行选择。
二、Spring Security OAuth介绍
Spring Security OAuth是Spring Security框架的扩展,提供了对OAuth身份验证和授权的支持。OAuth是一个开放标准的授权协议,允许用户授权第三方应用程序访问其资源,而无需共享其凭据(用户名和密码)。
Spring Security OAuth是一个专注于OAuth认证的框架,它完整覆盖了客户端、资源服务和认证服务三个模块。
- 客户端模块提供了OAuth客户端的实现,可以与OAuth认证服务器进行交互,以获取访问令牌。
- 资源服务模块提供了保护受OAuth保护的资源的功能,它可以验证请求中的访问令牌,并检查访问令牌的有效性和权限。
- 认证服务模块提供了OAuth认证服务器的实现,可以处理OAuth认证请求,并向客户端提供访问令牌。
Spring Security中集成了OAuth的客户端模块,它包含三个子模块,分别是:
-
spring-security-oauth2-core:该子模块包含OAuth2的核心功能,包括OAuth2的授权和令牌请求流程等。
-
spring-security-oauth2-client:该子模块提供了OAuth2客户端的实现,可以与OAuth2认证服务器进行交互,以获取访问令牌。
-
spring-security-oauth2-jose:该子模块提供了JSON Web令牌(JWT)的支持,可以使用JWT作为OAuth2访问令牌的替代方案。
二、使用Spring Security OAuth实现GitHub快捷登录
(1)新建工程
新建Spring Boot2.0 工程 ,pom包依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
</dependencies>
(2)注册OAuth应用
在GitHub官网上注册一个新的OAuth应用,地址是:New OAuth Application (github.com)
点击 Register application按钮,即可注册得到clientId 和clientSecret
当用户通过浏览器成功登录Github,并且用户在批准页授权允许注册的客户局端访问自己的用户数据后,GitHub会将授权码Code通过重定向的方式传递给客户端应用。
Spring Security OAuth默认的重定向模板是 {baseUrl}/login/oauth2/code/{registrationId},registrationId是ClientRegistration的唯一ID,通常以接入的OAuth服务提供商的简称来命名即可,所以此处设置为github。
(3)配置application.yml
在配置文件中增加相应的配置,client-id和client-secret就是刚才在github上获取的。
(4)新建Controller
参数中的principal对象由Spring框架自动注入,表示当前登录的用户
@RestController
public class SimpleController {
@GetMapping("/hello")
public String hello(Principal principal) {
String username = (String) ((OAuth2AuthenticationToken) principal).getPrincipal().getAttributes().get("login");
return "hello, " + username;
}
}
(5)效果演示
启动新建的OAuth工程,访问:http://localhost:8080/hello
单击Authorize zy19970116 按钮,以允许OAuth客户端应用访问GitHub的用户数据,此时OAuth客户端应用会调用用户数据接口,创建认证对象。浏览器最终将自动重定向到原访问地址:http://localhost:8080/hello, 并打印字符串 ”hello ,XXX“
总结:
GitHub代表的是OAuth服务提供商的角色,它提供了OAuth 2.0授权流程的实现,允许第三方应用程序使用OAuth 2.0协议与GitHub进行通信,从而获取用户的授权信息和资源。