Laravel——Passport OAuth

柴琦
2023-12-01

安装

在开始之前,请通过 Composer 包管理器安装 Passport:

composer require laravel/passport
复制代码

Passport 服务提供器使用框架注册自己的数据库迁移目录,因此在注册提供器后,就应该运行 Passport 的迁移命令来自动创建存储客户端和令牌的数据表:

php artisan migrate
复制代码

接下来,运行 passport:install 命令来创建生成安全访问令牌时所需的加密密钥,同时,这条命令也会创建用于生成访问令牌的「个人访问」客户端和「密码授权」客户端:

php artisan passport:install
复制代码

配置

上面命令执行后,请将 Laravel\Passport\HasApiTokens Trait 添加到 User 模型中, 这个 Trait 会给你的模型提供一些辅助函数,用于检查已认证用户的令牌和使用范围:

Models/User.php

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}
复制代码

在 AuthServiceProvider 的 boot 方法中调用 Passport::routes 函数。这个函数会注册发出访问令牌并撤销访问令牌、客户端和个人访问令牌所必需的路由:

Provinders/AuthServiceProvider.php

public function boot()
{
    $this->registerPolicies();

    Passport::routes();

    //设置token过期时间
    Passport::tokensExpireIn(now()->addDays(1)); 

    //设置刷新token过期时间
    Passport::refreshTokensExpireIn(now()->addDays(30));
}
复制代码

将配置文件 config/auth.php 中授权看守器 guards 的 api 的 driver 选项改为 passport。此调整会让你的应用程序在在验证传入的 API 的请求时使用 Passport 的 TokenGuard 来处理:

config/auth.php

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
            'hash' => false,
        ],
    ],
复制代码

密码模式

在应用程序通过密码授权机制来发布令牌之前,在 passport:client 命令后加上 --password 参数来创建密码授权的客户端。如果你已经运行了 passport:install 命令,则不需要再运行此命令:

php artisan passport:client --password

请求令牌

创建密码授权的客户端后,就可以使用用户的电子邮件地址和密码向 /oauth/token 路由发出 POST 请求来获取访问令牌。而该路由已经由 Passport::routes 方法注册,因此不需要手动定义它。如果请求成功,会在服务端返回的 JSON 响应中收到一个 access_token 和 refresh_token:

请求参数:

'grant_type' => 'password',
'client_id' => 'client-id', //需要使用password_client=1
'client_secret' => 'client-secret',
'username' => 'taylor@laravel.com',
'password' => 'my-password',
'scope' => '',
复制代码

自定义用户名字段

当使用密码授权时,Passport 默认使用 email 作为「用户名」。但是,你可以通过在模型上定义一个 findForPassport 方法来自定义用户名字段:

Models/User.php

/**
 * 通过用户名找到对应的用户信息
 *
 * @param  string  $username
 * @return \App\User
 */
public function findForPassport($username)
{
    return $this->where('username', $username)->first();
}
复制代码

路由保护

通过中间件

Passport 包含一个 验证保护机制 可以验证请求中传入的访问令牌。配置 api 的看守器使用 passport 驱动程序后,只需要在需要有效访问令牌的任何路由上指定 auth:api 中间件:

Route::middleware('auth:api')->group(function () {

});
复制代码

参考文档

Laravel5.8

转载于:https://juejin.im/post/5cb7d643518825186d654246

 类似资料: