OAuth 2.0 和 JWT 授权在 Java 中的实现:面向初学者的分步指南

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

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

开始课程

OAuth 2.0 和 JWT 在 Java 中的简介

\n\n

现代 Web 应用程序和 API 很少能离开身份验证和授权机制。该领域最流行的两个标准是 OAuth 2.0 和 JWT(JSON Web Token)。如果您是一名初学 Java 的开发者,理解这些技术将为您打开创建安全且可扩展系统的大门。

\n\n

OAuth 2.0 是一种授权协议,它允许应用程序在不传递用户凭证的情况下,获得对用户资源的有限访问权限。而 JWT 是一种紧凑的令牌格式,用于在各方之间传递声明(claims)。在本文中,我们将探讨如何使用 Spring Security 和流行的库,在 Java 应用程序中结合这些技术。

\n\n

OAuth 2.0 基础:它是如何工作的

\n\n

OAuth 2.0 定义了交互中的几个参与角色:

\n\n
    \n
  • Resource Owner — 拥有受保护数据的用户
  • \n
  • Client — 请求访问的应用程序
  • \n
  • Authorization Server — 在身份验证后颁发令牌的服务器
  • \n
  • Resource Server — 存储受保护资源的服务器
  • \n
\n\n

该协议的核心思想是,客户端获取一个临时的访问令牌,并将其出示给资源服务器。最常见的场景是 Authorization Code Flow,它用于 Web 应用程序。

\n\n

在 Spring Boot 中配置 OAuth 2.0 客户端的示例

\n\n

在 pom.xml 中添加依赖:

\n\n
<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:

\n\n
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\n

JWT:令牌的结构与创建

\n\n

JWT 由三部分组成,用点号分隔:

\n\n
    \n
  • Header — 包含令牌类型和签名算法(例如 HS256)
  • \n
  • Payload — 包含声明(claims):用户数据、过期时间、角色
  • \n
  • Signature — 使用密钥从头部和载荷创建的签名
  • \n
\n\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\n
import 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                

博客

书籍推荐