werk365/jwtauthroles

专为在 Laravel 中使用 JWT 集成 fusionauth 用户而设计。可以直接使用 pem 密钥或使用 jwks 端点。

1.2.3 2022-02-24 16:12 UTC

README

Latest Version on Packagist Total Downloads MIT Licensed Join the chat at https://gitter.im/werk365/Laravel-JWT-Auth-Roles

StyleCI Scrutinizer Quality Tests

专为在 Laravel 中使用来自外部身份提供者的 JWT 而设计。已测试与 Fusionauth,但应该是相当通用的。

使用此包,您可以验证传入的 JWT,并创建一个具有 JWT 中指定的角色的已认证用户,以便进行进一步的(基于路由的)身份验证。包括一个角色中间件。

.

请查看 contributing.md 以查看待办事项列表。

安装

通过 Composer

$ composer require werk365/jwtauthroles

发布配置和迁移

$ php artisan vendor:publish --provider="Werk365\JwtAuthRoles\JwtAuthRolesServiceProvider"

迁移只在您想缓存 JWKs 或存储用户时才需要,这可以在配置中进行配置。您可以使用此包而不在数据库中存储任何相关内容。

运行迁移

$ php artisan migrate

使用方法

在您的 AuthServiceProvider 中修改 boot()

use Illuminate\Support\Facades\Auth;
use Werk365\JwtAuthRoles\JwtAuthRoles;

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

    Auth::viaRequest('jwt', function ($request) {
        return JwtAuthRoles::authUser($request);
    });
}

然后要么将 config/auth.php 中的某个守卫更改为使用 jwt 驱动和 jwt_users 提供者,要么添加一个新的守卫

use Werk365\JwtAuthRoles\Models\JwtUser;
'guards' => [
    // ...
    'jwt' => [
        'driver' => 'jwt',
        'provider' => 'jwt_users',
        'hash' => false,
    ],
],

// ...

'providers' => [
    // ...
    'jwt_users' => [
        'driver' => 'eloquent',
        'model' => JwtUser::class,
    ],
],

现在您可以在路由中使用 JWT 守卫,例如在分组中

Route::group(['middleware' => ['auth:jwt']], function () {
    // Routes can go here
});

您还可以使用 RolesMiddelware 在路由上进行基于角色的身份验证,如下所示

    // single role
    Route::get('/exammple', function(){
        return "example";
    })->middleware('role:example');

    // multiple roles
    Route::get('/exammples', function(){
        return "examples";
    })->middleware('role:example|second|third|etc');

为了使已认证用户真正有用,JwtUser 模型扩展了 User 模型。这意味着您可以在 User 模型中定义任何关系,然后为已认证用户使用它们。

例如,在默认 User 模型中添加以下关系

    public function documents()
    {
        return $this->hasMany('App\Models\Document', 'user', 'uuid');
    }

这假设您有一个 Documents 模型,其中存储了您的身份提供者提供的 uuid,该 uuid 存储在 'user' 列中,当然可以是任何您想要的内容,但本地密钥始终应该是 uuid。

然后可以这样使用它来检索属于此用户的所有文档

return Auth::user()->documents;

最后,根据您的需求配置配置。默认发布的配置将验证 JWT,但不使用数据库。它看起来像这样

<?php

return [
    // If enabled, stores every user in the database
    'useDB' => env('FA_USE_DB', false),

    // Only if useDB = true
    // Column name in the users table where uuid should be stored.'
    'userId' => env('FA_USR_ID', 'uuid'),
    // Only if useDB = true
    'autoCreateUser' => env('FA_CREATE_USR', false),

    'alg' => env('FA_ALG', 'RS256'),

    // Allows you to skip validation, this is potentially dangerous,
    // only use for testing or if the jwt has been validated by something like an api gateway
    'validateJwt' => env('FA_VALIDATE', true),

    // Only if validateJwt = true
    'cache' => [
        'enabled' => env('FA_CACHE_ENABLED', false),
        'type' => env('FA_CACHE_TYPE', 'database'),
    ],

    // Only if validateJwt = true
    'jwkUri' => env('JWKS_URL', 'https://:9011/.well-known/jwks.json'),
    // Only if validateJwt = true
    'pemUri' => env('PEM_URL', 'https://:9011/api/jwt/public-key'),

    // Only if validateJwt = true
    // Configure to use PEM endpoint (default) or JWK
    'useJwk' => env('USE_JWK', false),

];

Laravel 版本

目前此包支持 Laravel 8。由于我们使用默认的用户模型,它期望它位于 app\Models\User 命名空间中。为了使此包与 Laravel 的早期版本兼容,您只需在此命名空间中创建一个模型即可,除此之外,此包应与任何最新版本兼容。

变更日志

请参阅 changelog 以获取有关最近更改的更多信息。

测试

尚未实现测试

贡献

请参阅 contributing.md 以获取详细信息以及待办事项列表。

安全

如果您发现任何安全相关的问题,请通过电子邮件 hergen.dillema@gmail.com 而不是使用问题跟踪器。

鸣谢

许可

许可。请参阅 许可文件 以获取更多信息。