OAuth 2.0 和 JWT 授权在 Java 中的实现:分步指南

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

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

开始课程

OAuth 2.0 和 JWT 授权在 Java 中的实践



现代 Web 应用程序和 API 很少能离开身份验证和授权机制。两种最流行的标准——OAuth 2.0 和 JWT(JSON Web Token)——允许安全地传输用户数据并提供对资源的访问。在本文中,我们将通过使用 Spring Boot 的实际示例,详细讲解如何在 Java 中实现 OAuth 2.0 和 JWT 授权。您将了解如何配置授权服务器、生成和验证 JWT 令牌,以及保护 REST API 的端点。



什么是 OAuth 2.0 和 JWT:简要概述

OAuth 2.0 是一种委托访问协议,允许第三方应用程序在不传递用户凭据的情况下获得对用户资源的有限访问权限。它广泛用于通过社交网络(Google、Facebook)登录以及保护 API。

JWT(JSON Web Token)是一种紧凑且自包含的令牌格式,包含用户信息(声明)并经过签名以验证完整性。JWT 通常用作 OAuth 2.0 中的访问令牌,因为它不需要在服务器上存储,并且可以轻松地在 HTTP 标头中传输。

在实践中,OAuth 2.0 定义了获取令牌的流程(flow),而 JWT 定义了令牌本身的格式。它们共同构成了一个强大且安全的授权系统。



配置带有依赖项的 Spring Boot 项目

首先,我们创建一个基本的 Spring Boot 项目。我们将使用 Spring Security、Spring Web 和一个用于处理 JWT 的库(例如 jjwt)。

将以下依赖项添加到您的 pom.xml(Maven)或 build.gradle(Gradle)中:

<!-- Maven --><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>

现在,我们创建一个安全配置类,该类将禁用 CSRF 并定义过滤器链。



实现授权服务器并生成 JWT

对于 OAuth 2.0,我们需要一个端点来接收客户端凭据并返回 JWT 令牌。在最简单的情况下,这可以模拟一个授权服务器。

创建一个用于处理 JWT 的服务:

import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import io.jsonwebtoken.security.Keys;import org.springframework.stereotype.Service;

import javax.crypto.SecretKey;import java.util.Date;

@Servicepublic class JwtService {

private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256); private final long expirationMs = 3600000; // 1 小时

public String generateToken(String username) { Date now = new Date(); Date expiryDate = new Date(now.getTime() + expirationMs);

return Jwts.builder() .subject(username) .issuedAt(now) .expiration(expiryDate) .signWith(secretKey) .compact(); }

public String

博客

书籍推荐