当前位置:首页 > PHP

php实现passport

2026-03-12 17:56:51PHP

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\AuthServiceProviderboot 方法中注册路由:

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 中自定义令牌响应格式:

php实现passport

Passport::tokensCan([
    'place-orders' => 'Place orders',
    'check-status' => 'Check order status',
]);

Passport::setDefaultScope([
    'check-status',
]);

注意事项

  • 生产环境必须使用 HTTPS
  • 定期轮换客户端密钥
  • 设置合理的令牌过期时间
  • 使用中间件限制访问频率
  • 敏感操作需要二次验证

通过以上步骤可实现完整的 OAuth2 认证流程,适用于单页应用(SPA)、移动应用和第三方服务集成。

标签: phppassport
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERVER…

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php 实现类

php 实现类

PHP 类的基本实现 在 PHP 中,类通过 class 关键字定义,后跟类名和一对花括号。类名通常遵循大驼峰命名法(如 ClassName)。以下是基本语法: class ClassName {…

php 实现无限分类

php 实现无限分类

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、菜单管理等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 这是最简单的实现方式,每个分类记录存储其父…