OAuth2 是一个授权框架,它使第三方应用程序(如 Google、GitHub 或 Facebook 等 HTTP 服务)能够安全且有限地访问用户资源。它允许用户授权第三方应用访问其数据,而无需向这些应用透露自己的账号密码。
在本指南中,我们将一起探索如何将 OAuth2 与 Spring Boot 和 Spring Security 集成,以实现通过 Google 等 OAuth2 提供商进行安全登录和访问控制的功能。
什么是 OAuth2?
OAuth2 (Open Authorization 2.0) 是一个框架,允许应用程序访问托管在外部服务上的用户数据,而无需用户分享他们的密码。取而代之的是,用户通过服务提供商颁发的令牌来授权访问。
OAuth2 的核心组件
- 资源拥有者: 授权访问其数据的用户。
- 客户端: 请求访问用户账户的应用程序。
- 授权服务器: 验证用户身份并颁发访问令牌的服务器。
- 资源服务器: 托管受保护资源并验证访问令牌的服务器。
OAuth2 授权流程
OAuth2 根据应用程序类型定义了多种流程:
- 授权码模式: 常用于服务器端应用程序。客户端首先接收一个授权码,然后将其交换为访问令牌。
- 简化模式: 用于客户端(基于浏览器)应用程序,其中访问令牌直接返回,无需授权码交换。
- 密码模式: 当客户端可以直接从资源拥有者处请求凭据时使用(仅限受信任的应用程序)。
- 客户端凭据模式: 当客户端访问其自己的资源而非用户的资源时使用。
前置准备:
- 对 Spring Boot 和 Spring Security 有较好的理解
- 已安装 JDK 17
- IntelliJ IDEA 或任何其他 IDE
- Google Cloud Console 账号(用于 OAuth 客户端设置)
- Maven 用于依赖管理
实现步骤
第 1 步:创建一个新的 Spring Boot 项目
让我们创建一个 Spring Boot 项目,配置如下:
- 项目名称: oauth2-spring-security
- 语言: Java
- 类型: Maven
- 打包方式: Jar
!Project Metadata创建新项目
第 2 步:添加依赖项
让我们在 pom.xml 中添加以下依赖:
XML
CODEBLOCK_442a30ca
创建项目后,IDE 中的文件夹结构将如下图所示:
!Folder Structure项目结构
第 3 步:配置 application.properties
让我们添加以下 Google OAuth2 配置:
> spring.application.name=oauth2-spring-security
>
> spring.security.oauth2.client.registration.google.client-id=YOURGOOGLECLIENT_ID
>
> spring.security.oauth2.client.registration.google.client-secret=YOURGOOGLECLIENT_SECRET
>
> spring.security.oauth2.client.registration.google.redirect-uri=http://localhost:8080/login/oauth2/code/{registrationId}
>
> spring.security.oauth2.client.registration.google.scope=profile,email
第 4 步:创建用户模型
User.java:
Java
CODEBLOCK_910f8130
这个类定义了一个包含 name 和 email 字段的用户,并使用 Lombok 来减少样板代码。
第 5 步:创建服务类
这个服务类负责从 OAuth2User 数据创建 User 对象。
UserService.java:
Java
`
package com.gfg.oauth2springsecurity.service;
import com.gfg.oauth2springsecurity.model.User;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public User createUser(OAuth2User oAuth2User) {
User use