soulcodex / model-keyable
允许将API密钥附加到Laravel模型
Requires
- php: ^7.3|^7.4|^8.0
- illuminate/contracts: ^7.0|^8.0
- spatie/laravel-package-tools: ^1.1
Requires (Dev)
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.3
- spatie/laravel-ray: ^1.9
- vimeo/psalm: ^4.4
This package is auto-updated.
Last update: 2024-09-07 00:27:35 UTC
README
Keyable是一个包,允许您向任何模型添加API密钥。这使您可以将传入的请求与相应的模型相关联。您还可以使用策略来授权请求。
安装
在您的 composer.json
中要求 soulcodex/keyable
包并更新您的依赖项
composer require soulcodex/model-keyable
发布迁移和配置文件
php artisan vendor:publish --provider="Soulcodex\Keyable\KeyableServiceProvider"
运行迁移
php artisan migrate
使用
将 Soulcodex\Keyable\Keyable
特性添加到您的模型(们)中
use Illuminate\Database\Eloquent\Model; use Soulcodex\Keyable\Keyable; class Account extends Model { use Keyable; // ... }
将 auth.apiKey
中间件添加到您的 App\Providers\RouteServiceProvider
文件中的 mapApiRoutes()
函数
// ... protected function mapApiRoutes() { Route::prefix('api') ->middleware(['api', 'auth.apikey']) ->namespace($this->namespace . '\API') ->group(base_path('routes/api.php')); } // ...
中间件将验证API请求,确保它们包含有效的API密钥。
在您的控制器中访问keyable模型
与密钥关联的模型将作为 keyable
附加到传入请求
use App\Http\Controllers\Controller; class FooController extends Controller { public function index(Request $request) { $model = $request->keyable; // ... } }
现在,您可以使用keyable模型来限定您的相关API资源,例如
return $model->foo()->get();
无模型的密钥
有时您可能不希望将模型附加到API密钥(如果您想对API有管理访问权限)。默认情况下,此功能是关闭的
<?php return [ 'allow_empty_models' => true ];
UUID支持
在迁移之前,您可以配置是否更喜欢使用bigint或uuid标识符。默认使用 bigint
,如 keyable_id
<?php return [ 'identifier' => 'bigint' ];
发起请求
默认情况下,laravel-keyable使用bearer令牌来验证请求。将API密钥附加到每个请求的标题
Authorization: Bearer <key>
您可以通过更改keyable.php
配置文件中的设置来更改检索API密钥的位置。支持选项是:bearer
、header
和parameter
。
由于它是一个数组,您可以使用多个这些选项并将它们组合起来。
<?php return [ 'modes' => ['header'], 'key' => 'X-Authorization', ];
需要将密钥作为URL参数传递?将模式设置为parameter
并将密钥设置为您的URL中使用的字符串
<?php return [ 'modes' => ['parameter'], 'key' => 'api_key' ];
现在,您可以像这样发出请求
https://example.com/api/posts?api_key=<key>
授权请求
Laravel提供了一种通过策略执行授权传入请求的出色方式。然而,它们仅限于认证用户。我们复制了该功能,让您可以授权任何传入的模型上的请求。
首先,将 AuthorizeKeyableRequest
特性添加到您的 Controller.php
基类
<?php namespace App\Http\Controllers; // ... use Soulcodex\Keyable\Auth\AuthorizeKeyableRequest; class Controller extends BaseController { use AuthorizeKeyableRequest; }
接下来,创建 app/Policies/KeyablePolicies
文件夹并创建一个新的策略
<?php namespace App\Policies\KeyablePolicies; use App\Models\Post; use Illuminate\Database\Eloquent\Model; use Soulcodex\Keyable\Models\ApiKey; class PostPolicy { public function view(ApiKey $apiKey, Model $keyable, Post $post) { return !is_null($keyable->posts()->find($post->id)); } }
最后,在 AuthServiceProvider.php
中注册您的策略
<?php namespace App\Providers; // ... use App\Models\Post; use App\Policies\KeyablePolicies\PostPolicy; use Soulcodex\Keyable\Facades\Keyable; class AuthServiceProvider extends ServiceProvider { // ... protected $keyablePolicies = [ Post::class => PostPolicy::class ]; public function boot(GateContract $gate) { // ... Keyable::registerKeyablePolicies($this->keyablePolicies); } }
在您的控制器中,您现在可以使用策略授权请求,通过调用 $this->authorizeKeyable(<ability>, <model>)
<?php namespace App\Http\Controllers\PostController; use App\Models\Post; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class PostController extends Controller { public function show(Post $post) { $this->authorizeKeyable('view', $post); // ... } }
Artisan命令
生成API密钥
php artisan api-key:generate --id=1 --type="App\Models\Account" php artisan api-key:generate --id='6324d582-5614-430b-a35c-c24b621a93c5' --type="App\Models\Account"
删除API密钥
php artisan api-key:delete --id=12345
php artisan api-key:delete --id='6324d582-5614-430b-a35c-c24b621a93c5'
安全性
如果您发现任何安全问题,请通过info@soulcodex.es发送电子邮件。