php实现passport
PHP 实现 Passport 认证
Passport 是 Laravel 官方提供的 OAuth2 认证服务器实现,用于 API 认证。以下是实现 Passport 的基本步骤:
安装 Passport
通过 Composer 安装 Passport 包:
composer require laravel/passport
运行数据库迁移,创建 Passport 所需的数据表:
php artisan migrate
安装 Passport,生成加密密钥和客户端:
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 方法中注册 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 --password
使用 Passport
在路由中使用 auth:api 中间件保护 API 路由:
Route::get('/user', function () {
return auth()->user();
})->middleware('auth:api');
获取访问令牌的示例请求:
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=*"
自定义 Passport 配置
令牌有效期设置
在 AuthServiceProvider 中自定义令牌有效期:
Passport::tokensExpireIn(now()->addDays(15));
Passport::refreshTokensExpireIn(now()->addDays(30));
作用域设置
定义作用域:
Passport::tokensCan([
'read' => 'Read access',
'write' => 'Write access',
]);
自定义客户端模型
创建自定义客户端模型并注册:
Passport::useClientModel(Client::class);
前端集成
JavaScript 集成
安装 laravel-passport npm 包:
npm install --save laravel-passport
在 JavaScript 中使用:
const { Passport } = require('laravel-passport');
Passport.initialize({
clientId: 'client-id',
clientSecret: 'client-secret',
});
Vue 集成
使用官方提供的 Vue 组件:
Vue.component(
'passport-clients',
require('./components/passport/Clients.vue').default
);
常见问题解决
令牌刷新问题
确保在 AuthServiceProvider 中正确设置刷新令牌有效期:
Passport::refreshTokensExpireIn(now()->addDays(30));
CORS 问题
在 app/Http/Middleware/VerifyCsrfToken.php 中添加例外:
protected $except = [
'oauth/*'
];
性能优化
对于高流量应用,考虑使用 Redis 存储令牌:
Passport::tokensExpireIn(now()->addDays(15));
Passport::refreshTokensExpireIn(now()->addDays(30));
Passport::personalAccessTokensExpireIn(now()->addMonths(6));






