Java 中 OAuth 2.0 和 JWT 简介
现代 Web 应用程序和 API 需要可靠的认证和授权机制。该领域最流行的两个标准是 OAuth 2.0 和 JWT(JSON Web 令牌)。如果您是一名初学 Java 的开发者,理解这些技术将为您创建安全且可扩展的应用程序铺平道路。
在本文中,我们将探讨什么是 OAuth 2.0 和 JWT,它们如何协同工作,以及如何使用流行的库在 Java 中实现它们。您将学习如何配置授权服务器、生成和验证 JWT 令牌,以及保护您的 REST API。
什么是 OAuth 2.0 和 JWT?
OAuth 2.0 — 委托访问协议
OAuth 2.0 是一种授权协议,允许应用程序在无需传递用户凭据的情况下,获取对用户资源的有限访问权限。想象一下,您想让某个应用程序访问您在 Google 中的照片。您无需将 Google 密码告知该应用程序,而是使用 OAuth 2.0,它会向应用程序颁发一个具有有限权限的临时令牌。
OAuth 2.0 的主要参与者:
- 资源所有者 — 拥有资源的用户
- 客户端 — 请求访问的应用程序
- 授权服务器 — 颁发令牌的服务器
- 资源服务器 — 提供受保护资源的服务器
JWT — 紧凑的令牌格式
JWT(JSON Web 令牌)是一种开放标准(RFC 7519),用于创建包含 JSON 格式声明(claims)的访问令牌。JWT 由三部分组成,各部分用点分隔:
- 头部 — 包含令牌类型和签名算法(例如 HS256 或 RS256)
- 载荷 — 包含声明(例如用户 ID、角色、有效期)
- 签名 — 保证令牌完整性的签名
JWT 示例:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
在 Java 中实现 OAuth 2.0 和 JWT
使用 Spring Security 配置项目
为了在 Java 中实现 OAuth 2.0 和 JWT,我们将使用 Spring Boot 和 Spring Security。首先,在 pom.xml 文件中添加依赖项:
<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>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.12.3</version></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.12.3</version> <scope>runtime</scope></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.12.3</version> <scope>runtime</scope></dependency>创建 JWT 提供者
创建一个 JwtProvider 类,负责生成和验证 JWT 令牌:
import io.jsonwebtoken.*;import io.jsonwebtoken.security.Keys;import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;import java.util.Date;
@Componentpublic class JwtProvider { private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256); private final