php实现passport
PHP 实现 Passport 认证
Passport 是 Laravel 官方提供的 OAuth2 服务器实现,用于 API 认证。以下是在 PHP 中实现 Passport 的步骤:
安装 Laravel Passport
确保已经安装了 Laravel 框架。通过 Composer 安装 Passport:
composer require laravel/passport
数据库迁移
Passport 的服务提供者会注册自己的数据库迁移目录。运行迁移命令创建 Passport 所需的数据表:
php artisan migrate
生成加密密钥
运行以下命令生成加密密钥,用于生成安全的访问令牌:
php artisan passport:install
配置 Passport
在 App\Models\User 模型中添加 HasApiTokens trait:
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
}
在 App\Providers\AuthServiceProvider 的 boot 方法中注册 Passport 路由:
use Laravel\Passport\Passport;
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
在 config/auth.php 配置文件中,将 API 认证驱动设置为 passport:
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
创建客户端
可以使用 Artisan 命令创建客户端:
php artisan passport:client
使用 Passport 进行认证
在路由中使用 auth:api 中间件保护 API 路由:
Route::get('/user', function () {
return auth()->user();
})->middleware('auth:api');
获取访问令牌
客户端可以通过 OAuth2 授权码或密码授权方式获取访问令牌。以下是密码授权的示例请求:
curl -X POST http://your-app.com/oauth/token \
-H "Accept: application/json" \
-d "grant_type=password" \
-d "client_id=client-id" \
-d "client_secret=client-secret" \
-d "username=user@example.com" \
-d "password=password" \
-d "scope=*"
刷新令牌
当访问令牌过期时,可以使用刷新令牌获取新的访问令牌:
curl -X POST http://your-app.com/oauth/token \
-H "Accept: application/json" \
-d "grant_type=refresh_token" \
-d "refresh_token=refresh-token" \
-d "client_id=client-id" \
-d "client_secret=client-secret"
撤销令牌
可以通过撤销令牌使令牌失效:
$user->tokens()->where('id', $tokenId)->delete();
自定义令牌有效期
在 App\Providers\AuthServiceProvider 的 boot 方法中自定义令牌有效期:
Passport::tokensExpireIn(now()->addDays(15));
Passport::refreshTokensExpireIn(now()->addDays(30));
使用作用域
定义作用域并分配给令牌:
Passport::tokensCan([
'place-orders' => 'Place orders',
'check-status' => 'Check order status',
]);
在请求令牌时指定作用域:
curl -X POST http://your-app.com/oauth/token \
-d "grant_type=password" \
-d "client_id=client-id" \
-d "client_secret=client-secret" \
-d "username=user@example.com" \
-d "password=password" \
-d "scope=place-orders check-status"
前端集成
在前端 JavaScript 应用中,可以使用 Laravel Passport 的 JavaScript SDK 轻松进行认证:
axios.get('/api/user', {
headers: {
'Authorization': 'Bearer ' + token
}
})
.then(response => {
console.log(response.data);
});
以上步骤展示了如何在 PHP 中使用 Laravel Passport 实现 OAuth2 认证服务器。根据应用需求,可以进一步定制和扩展功能。







