dusterio/lumen-passport

让Laravel Passport与Lumen协同工作

0.3.8 2023-08-10 21:53 UTC

README

Build Status Code Climate Total Downloads Latest Stable Version Latest Unstable Version License

让Laravel Passport与Lumen协同工作

介绍

这是一个简单的服务提供者,使得Laravel Passport能够在Lumen上运行。

安装

如果你还没有安装Lumen Micro-Framework,请先安装它:Lumen Micro-Framework

然后安装Lumen Passport

composer require dusterio/lumen-passport

或者,如果你愿意,可以手动编辑composer.json并运行composer update

{
    "require": {
        "dusterio/lumen-passport": "^0.3.5"
    }
}

修改引导流程

我们需要同时启用Laravel Passport提供者和Lumen Passport特定提供者

/** @file bootstrap/app.php */

// Enable Facades
$app->withFacades();

// Enable Eloquent
$app->withEloquent();

// Enable auth middleware (shipped with Lumen)
$app->routeMiddleware([
    'auth' => App\Http\Middleware\Authenticate::class,
]);

// Register two service providers, Laravel Passport and Lumen adapter
$app->register(Laravel\Passport\PassportServiceProvider::class);
$app->register(Dusterio\LumenPassport\PassportServiceProvider::class);

Laravel Passport ^7.3.2及更高版本

在2019年7月30日,Laravel Passport 7.3.2发生了重大变更——在Application类中引入了新的方法,该方法存在于Laravel中但不存在于Lumen中。你可以锁定到较旧版本,或者像以下那样替换Application类

/** @file bootstrap/app.php */

//$app = new Laravel\Lumen\Application(
//    dirname(__DIR__)
//);
$app = new \Dusterio\LumenPassport\Lumen7Application(
    dirname(__DIR__)
);

* 注意:如果你查看这个类——它所做的只是添加了一个额外的方法configurationIsCached(),该方法始终返回false

迁移并安装Laravel Passport

# Create new tables for Passport
php artisan migrate

# Install encryption keys and other stuff for Passport
php artisan passport:install

它将输出个人访问客户端ID和密钥,以及密码授权客户端ID和密钥。

* 注意:请将密钥保存在安全的地方,你稍后需要它们来请求访问令牌。

配置

配置身份验证

编辑config/auth.php以符合您的需求。一个简单的例子

/** @file config/auth.php */

return [

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => \App\Models\User::class
        ]
    ],

];

* 注意:Lumen 7.x及更早版本使用\App\User::class

由于Lumen不会自动加载配置文件,因此需要加载配置

/** @file bootstrap/app.php */

$app->configure('auth');

注册路由

接下来,你应该在您的应用程序的boot方法(其中一个服务提供者)中调用LumenPassport::routes方法。此方法将注册必要的路由以颁发访问令牌和撤销访问令牌、客户端和个人访问令牌

/** @file app/Providers/AuthServiceProvider.php */

use Dusterio\LumenPassport\LumenPassport;

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        LumenPassport::routes($this->app);

        /* rest of boot */
    }
}

用户模型

确保您的用户模型使用Laravel Passport的HasApiTokens特质。

/** @file app/Models/User.php */

use Laravel\Passport\HasApiTokens;

class User extends Model implements AuthenticatableContract, AuthorizableContract
{
    use HasApiTokens, Authenticatable, Authorizable, HasFactory;

    /* rest of the model */
}

使用方法

您可以在Laravel Passport 文档中找到所有文档。

Curl示例,带有用户名和密码身份验证

首先,您需要颁发一个访问令牌,然后您可以使用它来对请求进行身份验证。

# Request
curl --location --request POST '{{APP_URL}}/oauth/token' \
--header 'Content-Type: application/json' \
--data-raw '{
    "grant_type": "password",
    "client_id": "{{CLIENT_ID}}",
    "client_secret": "{{CLIENT_SECRET}}",
    "username": "{{USER_EMAIL}}",
    "password": "{{USER_PASSWORD}}",
    "scope": "*"
}'
{
    "token_type": "Bearer",
    "expires_in": 31536000,
    "access_token": "******",
    "refresh_token": "******"
}

有了access_token,您就可以请求访问使用由Lumen Passport提供的Auth:Api中间件提供的路由。

/** @file routes/web.php */

$router->get('/ping', ['middleware' => 'auth', fn () => 'pong']);
# Request
curl --location --request GET '{{APP_URL}}/ping' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}'
pong

已安装的路由

在您调用routes()方法后,此包将安装以下路由,所有路由都属于命名空间\Laravel\Passport\Http\Controllers

* 注意:一些Laravel Passport的路由不得不“消失”,因为它们与Web相关并且依赖于会话(例如,授权页面)。由于Lumen是API框架,因此只存在与API相关的路由。

额外功能

有一些额外的功能,这些功能在Laravel Passport中不存在

路由前缀

您可以将此添加到现有的分组中,或者像这样独立添加此路由注册器:

/** @file app/Providers/AuthServiceProvider.php */

use Dusterio\LumenPassport\LumenPassport;

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        LumenPassport::routes($this->app, ['prefix' => 'v1/oauth']);

        /* rest of boot */
    }
}

每个客户端多个令牌

有时允许每个密码授权客户端有多个访问令牌很有用。例如,用户可以从几个浏览器同时登录。目前Laravel Passport不允许这样做。

/** @file app/Providers/AuthServiceProvider.php */

use Dusterio\LumenPassport\LumenPassport;

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        LumenPassport::routes($this->app);
        LumenPassport::allowMultipleTokens();

        /* rest of boot */
    }
}

不同密码客户端的不同TTLs

Laravel Passport 允许为访问令牌设置一个全局的 TTL(生存时间),但在某些情况下,为不同的客户端设置不同的 TTL 可能很有用(例如,移动用户比桌面用户获得更多时间)。

只需在您的服务提供者中执行以下操作:

/** @file app/Providers/AuthServiceProvider.php */

use Carbon\Carbon;
use Dusterio\LumenPassport\LumenPassport;

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        LumenPassport::routes($this->app);
        $client_id = '1';
        LumenPassport::tokensExpireIn(Carbon::now()->addDays(14), $client_id); 

        /* rest of boot */
    }
}

如果您没有指定客户端 ID,它将回退到 Laravel Passport 的实现。

清除过期令牌

php artisan passport:purge

只需运行它即可从数据库中删除过期的刷新令牌及其相应的访问令牌。

错误和问题解决

请不要直接创建新问题,请先查看是否有人已经遇到过并解决了它。

如果您发现了错误或希望为改进此软件包做出贡献,请参阅贡献指南行为准则

视频教程

我刚刚开始了一个教育 YouTube 频道 config.sys,该频道将涵盖软件开发和 DevOps 的顶级趋势。

此外,我很高兴宣布我的最新工具 – GrammarCI,这是一个自动化的拼写和语法检查工具(作为 CI/CD 流程的一部分),以确保您的用户不会看到您的错误:)

许可证

MIT 许可证 (MIT) 版权所有 © 2016 Denis Mysenko

特此授予任何获得此软件及其相关文档副本(以下简称“软件”)的人免费使用权,不受限制地处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件的副本,并允许向软件提供的人这样做,前提是遵守以下条件:

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

本软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的,还是关于适销性、特定用途适用性或不侵犯的保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他方式,由软件、使用或以其他方式与软件相关联而产生。