soulcodex / model-keyable

允许将API密钥附加到Laravel模型

1.0.0 2021-02-24 23:20 UTC

This package is auto-updated.

Last update: 2024-09-07 00:27:35 UTC


README

Keyable是一个包,允许您向任何模型添加API密钥。这使您可以将传入的请求与相应的模型相关联。您还可以使用策略来授权请求。

Latest Stable Version Total Downloads Latest Unstable Version License

安装

在您的 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密钥的位置。支持选项是:bearerheaderparameter

由于它是一个数组,您可以使用多个这些选项并将它们组合起来。

<?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发送电子邮件。

许可证

MIT 许可证下发布。有关更多信息,请参阅LICENSE