rasyid46/lumen-passport

让Laravel Passport与Lumen协同工作

v1 2024-09-20 04:01 UTC

This package is not auto-updated.

Last update: 2024-09-21 01:39:52 UTC


README

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

让Laravel Passport与Lumen协同工作

介绍

这是一个简单的服务提供者,使得 Laravel Passport 能够与 Lumen 协同工作。

安装

首先,如果您还没有安装,请安装 Lumen 微型框架

然后安装 Lumen Passport

composer require rasyid46/lumen-passport:dev-master

或者,如果您愿意,可以手动编辑 composer.json 文件,然后运行 composer update

{
    "require": {
        "rasyid46/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 进行了重大更改 - 在 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 PassportHasApiTokens 特性。

/** @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 */
    }
}

不同密码客户端的不同 TTL

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 的顶级 IT 趋势。

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

许可证

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

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

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

本软件按“原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、适用于特定目的和不侵权保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是在合同行为、侵权行为或其他行为中产生的,与软件或软件的使用或其他操作有关。