werk365 / jwtauthroles
专为在 Laravel 中使用 JWT 集成 fusionauth 用户而设计。可以直接使用 pem 密钥或使用 jwks 端点。
Requires
- firebase/php-jwt: ^5.4
- illuminate/support: ~5|~6|~7|~8
- phpseclib/phpseclib: ^3.0.7
Requires (Dev)
- mockery/mockery: ^1.1
- orchestra/testbench: ~3|~4
- phpunit/phpunit: ^8.0
- sempro/phpunit-pretty-print: ^1.0
- dev-master
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.1
- 1.1.0
- 1.0.2
- 1.0.1
- 1.0.0
- 0.2.1
- 0.2.0
- 0.1.0
- 0.0.2
- 0.0.1
- dev-bug/stops-overwriting-roles-with-nothing
- dev-feature/optionally-store-roles
- dev-analysis-VrlxE3
- dev-feature/laravel-8-support
- dev-analysis-GDlbRO
- dev-analysis-1b0kpA
- dev-analysis-nNoKP5
- dev-analysis-4xgl4E
This package is auto-updated.
Last update: 2024-09-21 12:18:46 UTC
README
专为在 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 而不是使用问题跟踪器。
鸣谢
许可
许可。请参阅 许可文件 以获取更多信息。