Laravel Sanctum - легка автентифікація для API: персональні токени доступу (мобільні застосунки, інтеграції) і сесійна автентифікація для SPA.
Модель користувача:
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens;
}
Видача токена (наприклад, для входу з мобільного застосунку):
Route::post('/tokens', function (Request $request) {
$request->validate([
'email' => ['required', 'email'],
'password' => ['required'],
'device_name' => ['required', 'string', 'max:255'],
]);
$user = User::where('email', $request->email)->first();
if (! $user || ! Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages(['email' => ['Невірні облікові дані.']]);
}
return ['token' => $user->createToken($request->device_name)->plainTextToken];
});
Токен має вигляд 5|xYz...: id запису й випадкова частина.
Використання - заголовок Authorization:
GET /api/user
Authorization: Bearer 5|xYz...
Accept: application/json
Route::get('/user', fn (Request $request) => $request->user())->middleware('auth:sanctum');
Як Sanctum зберігає токени: у таблиці personal_access_tokens лежить лише SHA-256-хеш випадкової частини. Відкритий токен показується один раз при створенні - потім його неможливо відновити, лише створити новий. Витік бази не дає готових токенів.
Відкликання:
$request->user()->currentAccessToken()->delete(); // вихід з цього пристрою
$user->tokens()->delete(); // вихід з усіх пристроїв
Термін дії: за замовчуванням токени не мають терміну дії. Його задають глобально (expiration у config/sanctum.php, хвилини) або для конкретного токена третім аргументом createToken. Прострочені записи прибирає sanctum:prune-expired у планувальнику.
Що варто зробити в продакшені:
- обмежити частоту запитів до ендпойнта видачі токенів (захист від перебору паролів);
- задати термін дії токенів;
device_nameзрозумілий користувачу - щоб він міг побачити список пристроїв і відкликати зайвий;- префікс токенів (
token_prefixу конфігурації) - сканери секретів (наприклад, GitHub) зможуть розпізнати токен, що потрапив у публічний репозиторій.