Sanctum Laravel - это авторизация для API. Используется в бэкенд-приложениях.
Sanctum решает две проблемы: формирование API токена и аутентификации в приложении.
Установка и настройка
Сперва необходимо установить плагин с помощью composer
composer require laravel/sanctum
Далее публикуем необходимые настройки:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
Sanctum создаст нужную миграцию для хранения токенов. Миграцию необходимо выполнить:
php artisan migrate
Далее находим файл App\Http\Kernel.php
и заменяем значение api
'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ],
Model User
Далее открываем модель User, и вносим сюда следующие изменения:
use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; }
Middleware
Теперь для защиты маршрутов в API мы можем использовать middleware auth:sanctum
:
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Данный middleware уже используется в файле routes/api.php.
. Впоследствии перепишем его, создав группу для middleware auth:sanctum
Request UserRequest
Валидировать данные, необходимые для регистрации пользователя будем с помощью класса UserRequest. Сперва создадим его:
php artisan make:request UserRequest
Внесем необходимые изменения в класс:
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class UserRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name'=>'required|string', 'email'=>'required|string|unique:users|email', 'password'=>'required|confirmed' ]; } }
Таким образом, со стороны фронта нужно будет отправить следующие request-ы: name
, email
, password
, password_confirmation
Controller AuthController
Создадим контроллер AuthController
php artisan make:controller AuthController
Добавим метод регистрации register
namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; use App\Http\Requests\UserRequest; use Illuminate\Support\Facades\Hash; class AuthController extends Controller { public function register(UserRequest $r){ $r['password'] = Hash::make($r->password); $user = User::create($r->all()); $token = $user->createToken('myapptoken')->plainTextToken; $response = [ 'user'=>$user, 'token' => $token ]; return response()->json($response); } }
Маршрутизация
Для настройки маршрутов сперва в файл routes/api.php
подключим namespace к папке с контроллерами.
use App\Http\Controllers;
Теперь можем прописать нужные маршруты, разбив наши маршуты пока на две группы - открытые (public) и защищенные (protected) маршруты:
//public routes Route::post('register', [Controllers\AuthController::class, 'register']); //protected routes Route::group(['middleware'=>['auth:sanctum']], function(){ });
Postmen
Для тестирования запросов на бэк воспользуемся postmen. В папке с приложением создадим папку с коллекцией Auth и добавим туда нужные запросы. Обратие внимание на Headers. В заголовках должен быть отправлен Accept со значением application/json. После выставления заголовков, можно переключиться на вкладку params и там заполнить нужные для авторизации поля. После нажатия на кнопку send, при успешной авторизации мы увидим в ответе объект пользователя и token:
После того, как мы получили token, мы можем использовать его для защищённых запросов. Скопируем значение токена, и добавим его в значение Bearer Token вкладки Auth
Login и logout
Добавим в контроллер AuthController экшн входа - login.
public function login(Request $request){ $user = User::where('email', $request->email)->first(); if(!$user || !Hash::check($request->password, $user->password)){ return response()->json([ 'message' => 'bad credits' ]); } $token = $user->createToken('myapptoken')->plainTextToken; $response = [ 'user' => $user, 'token' => $token ]; return response()->json($response); }
Экшн выхода logout:
public function logout(Request $request) { auth()->user()->tokens()->delete(); return response()->json(['message'=>'Logged out']); }
Практика