Как получить юзера с помощью Bearer Token в Laravel Sanctum без использования миддлвара.

Как получить юзера с помощью Bearer Token в Laravel Sanctum без использования миддлвара.

Без использования миддлвара auth:sactum

В данной статье вы узнаете, как получить модель юзера по переданному токену авторизации не защищая маршрут миддлваром auth:sanctum. Это может быть полезно в случае, когда ваш маршрут является ситуативным и вы хотите, чтобы доступ к нему имелся как авторизованным запросам, так и не авторизованным. Защищая маршрут миддлваром auth:sanctum мы сознательно блокируем его для неавторизованных запросов.

Внимание, в этой статье не будет рассказано о том, что такое Bearer Token и Laravel Sanctum (об этом уже море контента на других источниках) и я надеюсь, вы знаете что это такое.

Ситуативные маршруты Laravel

Иногда возникают ситуации, когда нужно чтобы один API метод работал как ситуативный, обращаться к которому можно было бы как авторизованным, так и неавторизованным пользователям/запросам. Это может быть полезно в ситуациях, например, таких как логирование действий с фронта и соответственно передавая или не передавая заголовок авторизации Bearer Token в запрос, можно ассоциировать или не ассоциировать запрос с конкретным пользователем. Другими словами решение о том, связывать ли пользователя с запросом или нет мы оставляем за разработчиком фронта нашего приложения, а наш бэкенд, на основе передан ли заголовок авторизации или нет реализует свою последовательность действий.

Пример кода

Ниже приведен пример кода получения токена заголовка авторизации с помощью метода bearerToken() класса Illuminate\Http\Request. Метод возвращает строковое значение токена, либо null, если заголовок с токеном не был передан или токен не является типа Bearer. Пример показан на версиях PHP 8.0, Laravel 8.6 и Laravel Sanctum 2.15

//...
use Illuminate\Http\Request;
use Laravel\Sanctum\PersonalAccessToken;
use App\Models\User;
//...

/**
 * @param Request $request
 */
public function action(Request $request)
{
    //...

    // Получаем токен и передаем его в метод getUserByToken, ожидаем, что в ответе придет модель User или null
    $user = $this->getUserByToken($request->bearerToken());

    // Убедимся что мы получаем юзера или null при передаче или не передаче Bearer token
    dd($user);
    //ваш код...
}

/**
 * Метод обрабатывает Bearer token и либо возвращает модель User, либо null
 * @param string|null $token
 * @return null|User
 */
private function getUserByToken(string|null $token): ?User
{
    if ($token) {

        // По токену получаем объект владельца токена из метода класса Laravel\Sanctum\PersonalAccessToken
        $accessToken = PersonalAccessToken::findToken($token);

        if ($accessToken) {
            // Если нашли владельца токена, находим соответствующую модель User
            $user = User::where('id', $accessToken->tokenable_id)->first();
        } else {
            // Но, можем и не найти владельца токена, если например передан валидный, но несуществующий Bearer Token
            return null;
        }
        return $user ? $user : null;
    } else {
        return null;
    }
}

Заключение

На этом всё, если статья показалась вам полезной, то подпишитесь на нашу рассылку в боте ниже, обещаем присылать вам только интересный и полезный контент. Либо продолжите изучать статьи на нашем сайте.

Никита Ив
Никита Ив

Меня зовут Никита, я являюсь автором этой статьи. Занимаюсь веб-разработкой более 5-ти лет на стеке Laravel + Vue. Делюсь своим опытом, шишками и головной болью. Пишу полезные статьи, такие как эта. Подписывайтесь на наш телеграм канал, чтобы узнавать о появлении новых статей первыми, либо подпишитесь на рассылку, оставив почту в нашем боте ниже.

Другие записи по теме: Блог