OAuth 2.0 和 JWT 在 Java 中的授权:初学者指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

博客

书籍推荐