OAuth 2.0 和 JWT 在 Java 中的简介
\n\n现代 Web 应用程序和 API 很少能离开身份验证和授权机制。该领域最流行的两个标准是 OAuth 2.0 和 JWT(JSON Web Token)。如果您是一名初学 Java 的开发者,理解这些技术将为您打开创建安全且可扩展系统的大门。
\n\nOAuth 2.0 是一种授权协议,它允许应用程序在不传递用户凭证的情况下,获得对用户资源的有限访问权限。而 JWT 是一种紧凑的令牌格式,用于在各方之间传递声明(claims)。在本文中,我们将探讨如何使用 Spring Security 和流行的库,在 Java 应用程序中结合这些技术。
\n\nOAuth 2.0 基础:它是如何工作的
\n\nOAuth 2.0 定义了交互中的几个参与角色:
\n\n- \n
- Resource Owner — 拥有受保护数据的用户 \n
- Client — 请求访问的应用程序 \n
- Authorization Server — 在身份验证后颁发令牌的服务器 \n
- Resource Server — 存储受保护资源的服务器 \n
该协议的核心思想是,客户端获取一个临时的访问令牌,并将其出示给资源服务器。最常见的场景是 Authorization Code Flow,它用于 Web 应用程序。
\n\n在 Spring Boot 中配置 OAuth 2.0 客户端的示例
\n\n在 pom.xml 中添加依赖:
<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-oauth2-client</artifactId>\n</dependency>\n\n配置 application.yml 以使用 Google OAuth 2.0:
spring:\n security:\n oauth2:\n client:\n registration:\n google:\n client-id: YOUR_CLIENT_ID\n client-secret: YOUR_CLIENT_SECRET\n scope:\n - email\n - profile\n\n现在,Spring Security 将自动处理重定向到 Google 登录页面,并返回一个访问令牌。
\n\nJWT:令牌的结构与创建
\n\nJWT 由三部分组成,用点号分隔:
\n\n- \n
- Header — 包含令牌类型和签名算法(例如 HS256) \n
- Payload — 包含声明(claims):用户数据、过期时间、角色 \n
- Signature — 使用密钥从头部和载荷创建的签名 \n
在 Java 中处理 JWT 最常用的库是 jjwt。添加依赖:
\n\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-api</artifactId>\n <version>0.12.5</version>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-impl</artifactId>\n <version>0.12.5</version>\n <scope>runtime</scope>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-jackson</artifactId>\n <version>0.12.5</version>\n <scope>runtime</scope>\n</dependency>\n\n在 Java 中创建 JWT 令牌
\n\n这是一个用于生成和验证 JWT 的类示例:
\n\nimport io.jsonwebtoken.*;\nimport io.jsonwebtoken.security.Keys;\nimport javax.crypto.SecretKey;\nimport java.util.Date;\n\npublic class JwtUtil {\n\n private final SecretKey secretKey = Keys.hmacShaKeyFor(\n "my-secret-key-which-should-be-at-least-256-bits-long".getBytes()\n );\n\n public St