OAuth 2.0 和 JWT 在 PHP 中的授权:面向初学者的完整指南

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

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

开始课程

引言:为什么现代 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 流程如下:

  1. 客户端将用户重定向到授权服务器。
  2. 用户登录系统并授予权限。
  3. 授权服务器向客户端返回一个 authorization code(授权码)。
  4. 客户端用该授权码换取 access token(访问令牌)。
  5. 客户端使用访问令牌访问资源服务器。


什么是 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 库。



博客

书籍推荐