Laravel Passport 用于 PHP:OAuth2 服务器完整指南
\n\n1. 什么是 Laravel Passport 以及为什么需要它
\n\nLaravel Passport 是 Laravel (PHP) 框架的完整 OAuth2 服务器实现。它提供了一套现成的 API 认证工具集,使开发人员能够使用标准的访问令牌 (access tokens) 和刷新令牌 (refresh tokens) 快速为其 RESTful API 实施保护。该库基于强大的 League OAuth2 Server 包构建,并已适配 Laravel 生态系统,包括迁移、外观、Artisan 命令和 Eloquent 模型。
\n\nPassport 的主要目标是让开发人员免于手动编写生成、验证和存储令牌的复杂逻辑。相反,您将获得用于颁发令牌(通过 grant types)的现成路由、用于保护路由的中间件,以及用于管理客户端(应用程序)和令牌的便捷方法。Passport 非常适合需要安全访问您 API 的单页应用程序 (SPA)、移动应用程序和服务器端客户端。
\n\n为什么要使用 Passport 而不是自建解决方案?首先,安全性:该库实现了 OAuth2 规范的所有要求,包括 CSRF 防护、正确的 scope 处理和 PKCE (Proof Key for Code Exchange)。其次,开发速度:您将获得现成的迁移、模型和控制器。第三,灵活性:Passport 支持所有主要的 grant types(授权码、客户端凭证、密码授权、个人访问令牌),并且可以轻松扩展以满足特定需求。
\n\n2. 安装
\n\nLaravel Passport 的安装通过 Composer(PHP 的标准包管理器)进行。在您的 Laravel 项目根目录下执行以下命令:
\n\ncomposer require laravel/passport\n\n安装包后,需要执行迁移并发布配置。Passport 使用自己的迁移系统,该系统会创建用于存储客户端、令牌、授权码和个人访问令牌的表:
\n\nphp artisan migrate\n\n然后运行 passport:install 命令,该命令将创建加密密钥以及用于个人访问令牌和密码授权的客户端:
php artisan passport:install\n\n命令执行后,您将在控制台中看到两个 client_id 和 client_secret。第一个用于个人访问令牌 (Personal Access Client),第二个用于密码授权 (Password Grant Client)。将它们保存到 .env 文件中:
PASSPORT_PERSONAL_ACCESS_CLIENT_ID=1\nPASSPORT_PERSONAL_ACCESS_CLIENT_SECRET=your-secret-here\nPASSPORT_PASSWORD_GRANT_CLIENT_ID=2\nPASSPORT_PASSWORD_GRANT_CLIENT_SECRET=your-secret-here\n\n接下来,将 trait Laravel\\Passport\\HasApiTokens 添加到 User 模型 (app/Models/User.php) 中:
<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Foundation\\Auth\\User as Authenticatable;\nuse Illuminate\\Notifications\\Notifiable;\nuse Laravel\\Passport\\HasApiTokens;\n\nclass User extends Authenticatable\n{\n use HasApiTokens, Notifiable;\n\n protected $fillable = [\n 'name', 'email', 'password',\n ];\n\n protected $hidden = [\n 'password', 'remember_token',\n ];\n}\n\n在 config/auth.php 文件中,将认证驱动更改为 passport:
'guards' => [\n 'api' => [\n 'driver' => 'passport',\n 'provider' => 'users',\n ],\n],\n\n最后,在 app/Providers/AuthServiceProvider.php 文件的 boot() 方法中添加 Passport::routes() 调用:
<?php\n\nna