php实现passport
PHP 实现 Passport(OAuth2 服务器)
Passport 是 Laravel 官方提供的 OAuth2 服务器实现,用于 API 认证。以下是实现步骤和关键代码示例:
安装 Laravel Passport
通过 Composer 安装 Passport 包:
composer require laravel/passport
运行数据库迁移(生成 OAuth 相关表):
php artisan migrate
生成加密密钥和客户端密钥:
php artisan passport:install
配置 Passport
在 App\Models\User 模型中添加 HasApiTokens trait:
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
在 App\Providers\AuthServiceProvider 的 boot 方法中注册路由:
use Laravel\Passport\Passport;
public function boot()
{
Passport::routes();
Passport::tokensExpireIn(now()->addDays(15));
}
在 config/auth.php 中设置 API 驱动:
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
创建客户端
使用 Artisan 命令创建客户端:
php artisan passport:client --password
或通过代码动态创建:
$client = Passport::client()->create([
'user_id' => null,
'name' => 'Client Name',
'secret' => Str::random(40),
'redirect' => 'http://example.com/callback',
'personal_access_client' => false,
'password_client' => true,
'revoked' => false,
]);
实现 OAuth2 流程
密码授权示例(Password Grant):
Route::post('/oauth/token', function (Request $request) {
$response = Http::asForm()->post('http://your-app.com/oauth/token', [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => $request->email,
'password' => $request->password,
'scope' => '',
]);
return $response->json();
});
刷新令牌:
$response = Http::asForm()->post('http://your-app.com/oauth/token', [
'grant_type' => 'refresh_token',
'refresh_token' => 'existing-refresh-token',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'scope' => '',
]);
保护路由
使用 auth:api 中间件保护 API 路由:
Route::get('/user', function () {
return auth()->user();
})->middleware('auth:api');
前端集成(JavaScript)
通过 AJAX 获取访问令牌:
axios.post('/oauth/token', {
grant_type: 'password',
client_id: 'your-client-id',
client_secret: 'your-client-secret',
username: 'user@example.com',
password: 'password',
}).then(response => {
localStorage.setItem('access_token', response.data.access_token);
});
发送请求时携带令牌:
axios.get('/api/user', {
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('access_token')
}
});
自定义令牌响应
在 AppServiceProvider 中自定义令牌响应格式:

Passport::tokensCan([
'place-orders' => 'Place orders',
'check-status' => 'Check order status',
]);
Passport::setDefaultScope([
'check-status',
]);
注意事项
- 生产环境必须使用 HTTPS
- 定期轮换客户端密钥
- 设置合理的令牌过期时间
- 使用中间件限制访问频率
- 敏感操作需要二次验证
通过以上步骤可实现完整的 OAuth2 认证流程,适用于单页应用(SPA)、移动应用和第三方服务集成。






