Аутентификация с использованием Laravel Sanctum

Для веб-разработчиков важно, чтобы мы аутентифицировали наших пользователей через запрос API. В самом Laravel, помимо разработки полного стека, у нас есть много вариантов аутентификации запросов.

Например, у нас есть пакет Laravel Passport для выполнения процессов аутентификации и OAuth. Но если вы не хотите использовать функцию OAuth, которую предлагает Passport, вам может подойти Laravel Sanctum.

Laravel Sanctum предоставляет легкую систему аутентификации для SPA (одностраничных приложений), мобильных приложений и простых API на основе токенов.

Да, в Санктуме у нас есть два варианта. Первый — это аутентификация токена API, а второй — аутентификация SPA. Существует еще одна аутентификация, такая как мобильные приложения, но эта аутентификация имеет процесс, аналогичный аутентификации токена API.

Итак, следующий вопрос: в чем разница между токеном API и аутентификацией SPA? Аутентификация по токену API использует токен, который ваш клиент / интерфейс должен сначала выдать, прежде чем отправлять какие-либо запросы на сервер.

Ваш клиент получает токен через роут /login, затем при каждом следующем запросе токен должен включаться в заголовок Authorization с Bearer токеном. Довольно просто, не так ли?

С другой стороны, для аутентификации SPA не нужны никакие токены. Вместо этого он использует встроенные службы аутентификации сеансов Laravel на основе файлов cookie. Когда мы используем этот тип аутентификации, нам не нужно добавлять в заголовки Authorization Bearer токен в каждый запрос.

Полезно, когда вы создаете собственный SPA, чтобы ваш интерфейсный проект мог находиться внутри вашего проекта Laravel или полностью отдельного репозитория / проекта.

Итак, в этой статье я покажу вам, как создать аутентификацию по токену API с использованием Sanctum. Это очень простой проект, и, конечно же, вы можете увидеть github репозиторий в конце этой статьи.

Установка Laravel & Sanctum

Cоздадим новый проект Laravel:

composer create-project laravel/laravel laravel

Обычно laravel/sanctum уже включён в пакет laravel/laravel, то-есть выполнять composer require laravel/sanctum не обязательно.

Затем опубликуем файлы конфигурации и миграции Sanctum:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

Затем выполните миграцию базы данных. Так же, не забудьте настроить конфигурацию базы данных в файле .env

php artisan migrate

Маршруты для аутентификации

Во-первых, давайте начнем с базового построения конечных точек. Откройте файл routes/api.php и измените его.

use App\Http\Controllers\AuthController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);

Route::middleware('auth:sanctum')->group(function (){
    Route::get('/user', function (Request $request){
        return $request->user();
    });
});

Контроллер для аутентификации

Создадим новый контроллер следующей командой:

 php artisan make:controller AuthController

Откроем файл Http/Controllers/AuthController.php и добавим следующий код:

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class AuthController extends Controller
{
    public function register(Request $request)
    {
        $attr = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|unique:users,email',
            'password' => 'required|string|min:6|confirmed'
        ]);

        $user = User::create([
            'name' => $attr['name'],
            'password' => bcrypt($attr['password']),
            'email' => $attr['email']
        ]);

        $token = $user->createToken('user_token')->plainTextToken;

        return response()->json([
            'user'=>$user,
            'token'=> $token
        ]);
    }
}

Тестирование регистрации

Сначала давайте попробуем выполнить шаг регистрации.

После успешной регистрации мы получим токен. Затем мы отправим еще один запрос в /api/user, чтобы проверить, правильно ли конечная точка возвращает аутентифицированного пользователя. Не забывайте, что нужно добавить Bearer токен в заголовок Authorization.

Как видно из приведенного выше результата, конечная точка отправляет обратно правильно прошедшего проверку пользователя. Попробуйте удалить токен или сделать его недействительным, чтобы вы не прошли проверку подлинности.

Это простое руководство о том, как мы используем Sanctum для аутентификации по API. Но, как вы знаете, у Sanctum тоже есть некоторые функции, например, вы можете легко управлять и назначать возможности токенов с помощью этой команды:

return $user->createToken('token-name', ['server:update'])->plainTextToken;

И проверьте возможности токена пользователя с помощью:

if ($user->tokenCan('server:update')) {
    //
}

Вот и все о том, как мы можем использовать Sanctum для выполнения процесса аутентификации API. Я надеюсь, что эта статья может быть хорошим справочником для ваc.

Написать комментарий