引言:为什么现代 Web 应用需要 OAuth 2.0 和 JWT?
在现代 Web 开发中,客户端与服务器之间的安全数据传输是一项关键任务。传统的身份验证方法(例如基于 Cookie 的会话)对于单体应用效果良好,但在构建 REST API、移动应用或微服务架构时会变得不便。正是在这里,两个强大的工具应运而生:OAuth 2.0 协议和 JWT(JSON Web Token)令牌格式。
在本文中,我们将解析 OAuth 2.0 和 JWT 的基本概念,然后逐步在 PHP 中创建一个简单的授权系统。本文面向初学者开发者,因此所有解释都将尽可能简单,并附带实用的代码示例。
什么是 OAuth 2.0,它是如何工作的?
OAuth 2.0 是一种授权协议,允许应用程序在不传递用户登录名和密码的情况下,获得对用户资源的有限访问权限。想象一下,您想通过 Google 或 Facebook 账户登录一个网站——这就是 OAuth 2.0 的工作方式。
OAuth 2.0 中的主要角色
- Resource Owner(资源所有者) — 拥有数据的用户。
- Client(客户端) — 想要访问用户数据的应用程序。
- Authorization Server(授权服务器) — 在成功身份验证后颁发令牌的服务器。
- Resource Server(资源服务器) — 存储受保护数据并验证令牌的服务器。
授权流程(授权码模式)
最常见且最安全的 OAuth 2.0 流程如下:
- 客户端将用户重定向到授权服务器。
- 用户登录系统并授予权限。
- 授权服务器向客户端返回一个 authorization code(授权码)。
- 客户端用该授权码换取 access token(访问令牌)。
- 客户端使用访问令牌访问资源服务器。
什么是 JWT,为什么它如此流行?
JWT(JSON Web Token) 是一种紧凑且自包含的令牌格式,用于以 JSON 对象的形式在各方之间传输信息。JWT 中的信息可以被验证和信任,因为令牌带有数字签名。
JWT 的结构
JWT 由三部分组成,用点分隔:
header.payload.signature- Header(头部) — 包含令牌类型(JWT)和签名算法(例如 HS256 或 RS256)。
- Payload(载荷) — 包含数据(声明),例如用户 ID、角色、令牌创建时间和过期时间。
- Signature(签名) — 通过使用密钥对头部和载荷进行加密生成。
JWT 的优势
- 自包含性 — 所有必要信息都存储在令牌内部,从而减轻数据库负载。
- 安全性 — 令牌经过签名,因此无法被伪造。
- 通用性 — 适用于任何编程语言和平台。
- 可扩展性 — 非常适合微服务和分布式系统。
实践实现:在 PHP 中创建授权系统
现在让我们进入最有趣的部分——编写代码。我们将创建一个简单的 PHP 脚本,用于生成 JWT 令牌并在每次请求时验证它。为了处理 JWT,我们将使用 firebase/php-jwt 库。