sinema/gate-guardian

守卫;检查JWT与不同守卫类型的匹配;默认为Zitadel

0.1.2 2023-03-22 18:36 UTC

This package is auto-updated.

Last update: 2024-09-22 21:52:21 UTC


README

要求

此包证明了一个JWT Zitadel用户授权的实例。确保您将Zitadel JWT配置为访问令牌并传递角色。它需要跟踪不同的授权机制

  • Zitadel (PKCE)
  • 自定义守卫

安装

需要sinema/gate-guardian并在您的composer.json中添加GitHub仓库。

{
    "require": {
        "php": "^8.2.0",
        "sinema/gate-guardian": "dev-main",
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/SineMah/gate-guardian.git"
        }
    ],
    "minimum-stability": "dev",
    "prefer-stable": true
}

composer install

如果您想覆盖它,则发布配置。php artisan vendor:publish --tag=cloak-port-config

使用

您仍然可以使用自己的GuardType扩展行为。确保您实现了GuardTypeContract。如果您添加了新的GuardType,则可以添加自己的守卫。

在认证配置和路由中定义CloakPort

在您的auth.php文件中

<?php

return [
    // ...
    'guards' => [
        'gate_keeper' => [
            'driver' => 'gate_guardian',
            'provider' => 'users',
        ],
        // ...
    ],
    // ...
];

在您的routes/api.php

<?php

use App\Http\Controllers\AnyController;
use Illuminate\Support\Facades\Route;

Route::prefix('v1')->middleware(['auth:gate_keeper'])->group(function () {
  Route::get('/any-route', [AnyController::class, 'index']);
});

配置

key_identifier

如果key_identifier部分的任何密钥与您的Bearer令牌负载匹配,则识别Keycloak JWT。

guards

已加载的守卫。顺序方向影响您守卫的加载顺序。Keycloak和Passport用户守卫将始终具有最高优先级,因为它们是最严格的。

factory

如有必要,用您自己的工厂替换GuardType。请注意,您仍然需要为keycloakpassport_userpassport_client提供覆盖。

扩展

config

return [
    // ...
    'guards' => [
        'my_new_guard',
        'zitadel',
        'default'
    ],
    'factory' => My\Package\MyGuardType::class,
];

GuardType

<?php

namespace My\Package;

use CloakPort\GuardContract;
use CloakPort\GuardTypeContract;
use CloakPort\TokenGuard as DefaultGuard;
use My\Package\TokenGuard as MyGuard;

enum GuardType implements GuardTypeContract
{
    case ZITADEL;
    case MY_GUARD;
    case DEFAULT;

    public static function load(string $backend): self
    {
        return match(strtolower($backend)) {
            'my_guard' => GuardType::MY_GUARD,
            // ...
            default => GuardType::DEFAULT
        };
    }

    public function loadFrom(array $config): GuardContract
    {
        return match ($this) {
            self::MY_GUARD => MyGuard::load($config),
            // ...
            self::DEFAULT => DefaultGuard::load($config)
        };
    }
}

TokenGuard

如有必要,覆盖任何其他公共方法,如user

<?php

namespace My\Package;

use CloakPort\GuardContract;
use CloakPort\TokenGuard as ParentTokenGuard;
use Illuminate\Contracts\Auth\Guard;

class TokenGuard extends ParentTokenGuard implements Guard, GuardContract
{
    public static function load(array $config): self
    {
        return new self();
    }
    
    public function validate(array $credentials = [])
    {
        // any magic to valid your JWT
        return $this->check();
    }

    public function check()
    {
        return false;
    }
}