supaapps/supaapps-guard

一个 JWT 认证驱动,专为与 supaapps-auth-server 一起使用而设计


README

安装

composer require supaapps/supaapps-guard

环境变量

将环境变量添加到您的 .env

SUPAAPPS_GUARD_AUTH_SERVER_URL=http://example.com
SUPAAPPS_GUARD_AUTH_REALM_NAME=myapp

添加新的自定义守卫

config/auth.php 中添加新的守卫

'guards' => [
    'jwt' => [
        'driver' => 'supaapps-guard',
        'provider' => 'users',
    ],
],

此外,将默认守卫设置为 jwt

'defaults' => [
    'guard' => 'jwt',
    ...

使用示例

routes/api.php 中,添加以下行

Route::middleware('auth:jwt')->get('/user', function (Request $request) {
    return [
        $request->user(),
        auth()->firstName(),
        auth()->lastName(),
        auth()->email(),
        auth()->scopes(),
        auth()->scopesArray(),
    ];
});

注意:默认情况下,auth() 使用默认驱动。如果您未将 jwt 设置为默认驱动,那么您需要在先前的使用示例中调用 auth('jwt')

测试

您可以为测试生成 JWT 令牌。它将使用测试文件夹中的 private_key 生成,并将与同一文件夹中的 public_key 进行比较。 示例

use Tests\TestCase;
use Supaapps\Guard\Tests\Concerns\GenerateJwtToken;

class CustomTest extends TestCase
{
    use GenerateJwtToken;

    public function testThatIAmActingAsUser(): void
    {
        $user = User::factory()->create();

        $this->withAccessTokenFor($user);

        $this->assertTrue(auth('jwt')->check());
        $this->assertTrue($user->id, auth('jwt')->id());
    }
}

HTTP 测试

withAccessTokenFor 方法将 Bearer 令牌添加到由 http 测试发送的 headers 中。但是,您需要在您的测试中某处指定服务器 URL。例如,tests/CreatesApplication

<?php
use Supaapps\Guard\Tests\Concerns\GenerateJwtToken;

trait CreatesApplication
{
    use GenerateJwtToken;

    public function createApplication(): Application
    {
        ...

        $this->setAuthServerUrl();
        return $app;
    }
}

接下来运行您的 http 测试,例如

<?php

namespace Tests\Feature;

use Tests\TestCase;

class CustomTest extends TestCase
{
    public function itReturnsTheAuthUser(): void
    {
        $user = User::factory()->create();

        $this->withAccessTokenFor($user);

        // assume you have /user endpoint that
        // - uses auth:jwt middleware
        // - and returns auth user
        $response = $this->getJson('/user');

        $response->assertOk()
            ->assertJson($user->toArray());
    }
}