# Руководство по установке и настройке Laravel Sanctum с API авторизацией ## Описание Данное руководство описывает процесс установки и настройки **Laravel Sanctum** для API аутентификации с использованием **wadakatu/laravel-spectrum** для автоматической генерации Swagger документации. --- ## Содержание 1. [Установка пакетов](#1-установка-пакетов) 2. [Настройка Sanctum](#2-настройка-sanctum) 3. [Структура API](#3-структура-api) 4. [API Endpoints](#4-api-endpoints) 5. [Использование API](#5-использование-api) 6. [Swagger документация](#6-swagger-документация) 7. [Команды Artisan](#7-команды-artisan) --- ## 1. Установка пакетов ### 1.1 Установка Laravel Sanctum ```bash composer require laravel/sanctum ``` ### 1.2 Установка wadakatu/laravel-spectrum ```bash composer require wadakatu/laravel-spectrum ``` ### 1.3 Публикация конфигураций ```bash # Публикация Sanctum php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" # Публикация Spectrum (если требуется) php artisan vendor:publish --provider="Wadakatu\LaravelSpectrum\LaravelSpectrumServiceProvider" ``` ### 1.4 Запуск миграций ```bash php artisan migrate ``` > **Примечание:** Если таблица `personal_access_tokens` уже существует, пропустите этот шаг. --- ## 2. Настройка Sanctum ### 2.1 Обновление модели User Добавьте трейт `HasApiTokens` в модель `User`: ```php // app/Models/User.php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // ... } ``` ### 2.2 Настройка middleware Обновите файл `bootstrap/app.php`: ```php // bootstrap/app.php return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware): void { // }) ->withExceptions(function (Exceptions $exceptions): void { // })->create(); ``` > **Важно:** Не используйте `statefulApi()` для чистого token-based API, это вызовет ошибку 419 CSRF. ### 2.3 Конфигурация Sanctum ```php // config/sanctum.php return [ 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s', 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' ))), 'guard' => ['web'], 'expiration' => null, 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), 'middleware' => [ 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, ], ]; ``` --- ## 3. Структура API ### 3.1 Директории ``` app/ ├── Http/ │ ├── Controllers/ │ │ └── Api/ │ │ ├── AuthController.php │ │ └── PostController.php │ ├── Requests/ │ │ ├── LoginRequest.php │ │ ├── RegisterRequest.php │ │ ├── StorePostRequest.php │ │ └── UpdatePostRequest.php │ └── Resources/ │ ├── PostCollection.php │ ├── PostResource.php │ └── UserResource.php └── Policies/ └── PostPolicy.php ``` ### 3.2 API Resources **Laravel Spectrum** автоматически определяет структуру ответа из API Resources. ```php // app/Http/Resources/UserResource.php namespace App\Http\Resources; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class UserResource extends JsonResource { public function toArray(Request $request): array { return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'role' => $this->role, 'created_at' => $this->created_at, ]; } } ``` ```php // app/Http/Resources/PostResource.php namespace App\Http\Resources; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class PostResource extends JsonResource { public function toArray(Request $request): array { return [ 'id' => $this->id, 'title' => $this->title, 'content' => $this->content, 'user_id' => $this->user_id, 'user' => new UserResource($this->whenLoaded('user')), 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; } } ``` ### 3.3 Form Requests **Laravel Spectrum** автоматически определяет правила валидации из Form Requests. ```php // app/Http/Requests/RegisterRequest.php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class RegisterRequest extends FormRequest { public function authorize(): bool { return true; } public function rules(): array { return [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'string', 'min:8', 'confirmed'], ]; } } ``` ```php // app/Http/Requests/LoginRequest.php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class LoginRequest extends FormRequest { public function authorize(): bool { return true; } public function rules(): array { return [ 'email' => ['required', 'string', 'email'], 'password' => ['required', 'string'], ]; } } ``` ```php // app/Http/Requests/StorePostRequest.php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class StorePostRequest extends FormRequest { public function authorize(): bool { return true; } public function rules(): array { return [ 'title' => ['required', 'string', 'max:255'], 'content' => ['required', 'string'], ]; } } ``` --- ## 4. API Endpoints ### 4.1 Маршруты ```php // routes/api.php use App\Http\Controllers\Api\AuthController; use App\Http\Controllers\Api\PostController; use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | API Routes |-------------------------------------------------------------------------- */ // Swagger Documentation - редирект на Swagger UI Route::get('/docs', function () { return redirect()->to('/docs/index.html'); }); // Public routes (без авторизации) Route::post('/register', [AuthController::class, 'register'])->name('api.register'); Route::post('/login', [AuthController::class, 'login'])->name('api.login'); // Protected routes (требуют авторизации) Route::middleware('auth:sanctum')->group(function () { // Auth Route::post('/logout', [AuthController::class, 'logout'])->name('api.logout'); Route::get('/user', [AuthController::class, 'user'])->name('api.user'); // Posts Route::get('/posts', [PostController::class, 'index'])->name('api.posts.index'); Route::post('/posts', [PostController::class, 'store'])->name('api.posts.store'); Route::get('/posts/{post}', [PostController::class, 'show'])->name('api.posts.show'); Route::put('/posts/{post}', [PostController::class, 'update'])->name('api.posts.update'); Route::delete('/posts/{post}', [PostController::class, 'destroy'])->name('api.posts.destroy'); }); ``` ### 4.2 Список Endpoints | Метод | Endpoint | Описание | Авторизация | |-------|----------|----------|-------------| | POST | `/api/register` | Регистрация | Нет | | POST | `/api/login` | Вход | Нет | | POST | `/api/logout` | Выход | Да | | GET | `/api/user` | Текущий пользователь | Да | | GET | `/api/posts` | Список постов | Да | | POST | `/api/posts` | Создание поста | Да | | GET | `/api/posts/{id}` | Просмотр поста | Да | | PUT | `/api/posts/{id}` | Обновление поста | Да | | DELETE | `/api/posts/{id}` | Удаление поста | Да | | GET | `/api/docs` | OpenAPI спецификация | Нет | --- ## 5. Использование API ### 5.1 Регистрация ```bash curl -X POST http://la.test/api/register \ -H "Content-Type: application/json" \ -d '{ "name": "John Doe", "email": "john@example.com", "password": "password123", "password_confirmation": "password123" }' ``` ### 5.2 Вход ```bash curl -X POST http://la.test/api/login \ -H "Content-Type: application/json" \ -d '{ "email": "john@example.com", "password": "password123" }' ``` ### 5.3 Создание поста ```bash curl -X POST http://la.test/api/posts \ -H "Content-Type: application/json" \ -H "Authorization: Bearer {token}" \ -d '{ "title": "My First Post", "content": "This is the content of my post." }' ``` ### 5.4 Выход ```bash curl -X POST http://la.test/api/logout \ -H "Authorization: Bearer {token}" ``` --- ## 6. Swagger документация ### 6.1 Доступ к документации Документация Swagger UI доступна по адресу: ``` {APP_URL}/api/docs ``` Например: `http://la.test/api/docs` ### 6.2 Генерация документации Сначала сгенерируйте OpenAPI спецификацию: ```bash php artisan spectrum:generate ``` ### 6.3 Настройка доступа Для работы Swagger UI необходимо: **1. Создать символическую ссылку:** ```bash ln -sf /home/user/www/lara/storage/app/spectrum /home/user/www/lara/public/spectrum ``` **2. Создать HTML файл Swagger UI:** ```html