Публікація

Створення власного User Provider для Laravel 11

Коли почав використовувати JWT Auth знадобилося створити Custom User Provider, який вміє отримувати користувача за email

Я почав використовувати пакет JWT Auth для проєкта “частково статичний клон Reddit”. І стикнувся зі сценарієм, коли в мене є JWT-токен з email і треба написати власний User Provider, щоб він вмів шукати користувача за email бо дефолтний User Provider працює лише з ID.

Контракт, котрий потрібно реалізувати наступний:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

namespace Illuminate\Contracts\Auth;

interface UserProvider
{
    public function retrieveById($identifier);

    public function retrieveByCredentials(array $credentials);

    public function validateCredentials(Authenticatable $user, array $credentials);

    public function retrieveByToken($identifier, $token);

    public function updateRememberToken(Authenticatable $user, $token);

    public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false);
}

В цьому контракті нас цікавлять методи: retrieveById(), retrieveByCredentials(), validateCredentials() інші методи можно залишити пустими, так як вони потрібні для роботи з токеном для функціоналу Remember me, який я не використовую.

Створюємо файл профайдера app/Providers/CustomUserProvider.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php

namespace App\Providers;

use App\Models\User;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Auth\UserProvider as UserProviderContract;

class CustomUserProvider implements UserProviderContract
{
    public function retrieveById($identifier)
    {
        return User::where("email", $identifier)->first();
    }

    public function retrieveByCredentials(array $credentials)
    {
        return User::where("email", $credentials["email"])->first();
    }

    public function validateCredentials(
        Authenticatable $user,
        array $credentials
    ) {
        return !empty($credentials["email"]);
    }

    public function retrieveByToken($identifier, $token)
    {
        return null;
    }

    public function updateRememberToken(Authenticatable $user, $token)
    {
    }

    public function rehashPasswordIfRequired(
        Authenticatable $user,
        array $credentials,
        bool $force = false
    ) {
    }
}

Після чого треба зареєструвати новий провайдер в app/Providers/AppServiceProvider.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

namespace App\Providers;

//...

class AppServiceProvider extends ServiceProvider
{
    //...

    public function register(): void
    {
        Auth::provider("custom", function ($app, array $config) {
            return new CustomUserProvider();
        });
    }

    //...
}

Далі необхідно вказати в конфігу config/auth.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

return [
    //...

    "guards" => [
        "api" => [
            "driver" => "jwt",
            "provider" => "users",
        ],
    ],

    //...

    "providers" => [
        "users" => [
            "driver" => "custom",
            "model" => env("AUTH_MODEL", App\Models\User::class),
        ],
    ],

    //...
];
Публікація захищена ліцензією CC BY 4.0 .

© jmas. Деякі права захищено.

Powered by Jekyll with Chirpy theme