Без использования миддлвара 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;
}
}
Заключение
На этом всё, если статья показалась вам полезной, то подпишитесь на нашу рассылку в боте ниже, обещаем присылать вам только интересный и полезный контент. Либо продолжите изучать статьи на нашем сайте.