wg-hyve/cloak-port

守卫;检查JWT与不同守卫类型;默认keycloak & passport

0.0.12 2024-07-23 08:47 UTC

README

需求

此包通过JWT证明Keycloak、Passport客户端和Passport用户的授权实例。它需要跟踪三种不同的授权机制

  • Keycloak
  • Passport用户
  • Passport客户端

Keycloak

https://github.com/wg-hyve/laravel-keycloak-guard/tree/wg

Passport客户端

常规客户端凭证授权

Passport用户

Passport用户是带有确定用户的客户端登录。(密码授权)

安装

要求wg-hyve/cloak-port并在您的composer.json中添加GitHub仓库。

composer require wg-hyve/cloak-port

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

使用

安装Passport和Keycloak包。它应该能够直接使用。您仍然可以通过自己的GuardType扩展行为。请确保您实现了GuardTypeContract。如果您添加了新的GuardType,您可以添加自己的守卫。

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

在您的auth.php文件中

<?php

return [
    // ...
    'guards' => [
        'cloak_n_dagger' => [
            'driver' => 'keycloak_passport',
            'provider' => 'users',
        ],
        // ...
    ],
    // ...
];

在您的routes/api.php

<?php

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

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

配置

keycloak_key_identifier

如果Bearer token负载中的任何密钥与keycloak_key_identifier部分匹配,则识别keycloak JWT。

guards

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

factory

如果需要,请用您自己的工厂替换GuardType。请记住,您仍然需要为keycloakpassport_userpassport_client提供覆盖率。

扩展

config

return [
    // ...
    'guards' => [
        'my_new_guard',
        'passport_user',
        'passport_client',
        'keycloak',
        '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 KEYCLOAK;
    case PASSPORT_CLIENT;
    case PASSPORT_USER;
    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。在您的守卫中提供一个setConfig方法和一个局部的 $config 属性。

<?php

namespace My\Package;

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

class TokenGuard extends ParentTokenGuard implements Guard, GuardContract
{
    protected array $config = [];
    
    public static function load(array $config): self
    {
        return new self();
    }
    
    public function setConfig(array $config): self
    {
        $this->config = $config;

        return $this;
    }
    
    public function validate(array $credentials = [])
    {
        // any magic to valid your JWT
        return $this->check();
    }

    public function check()
    {
        return false;
    }
}