Laravel Passport подаётся как "коробочное решение для OAuth2". Ну да, коробка есть, но внутри, как обычно, набор деталей IKEA без инструкции. Хочешь собрать сервер OAuth2 — доставай отвертку и матерись.

Первое столкновение: установка

Тут без чудес:

composer create-project laravel/laravel passport-example
cd passport-example
composer require laravel/passport

Если у тебя нет Composer — сначала поставь, потом приходи.

Запускаем миграции:

php artisan migrate
php artisan passport:install

Эти команды накидают в базу пару таблиц и сгенерят ключи, без которых твой "сервер OAuth2" даже не встанет.

AuthServiceProvider: та самая рутина

Пишешь в AuthServiceProvider.php:

use Laravel\Passport\Passport;

public function boot()
{
    $this->registerPolicies();
    Passport::routes();
}

Вот тут многие любят забыть Passport::routes() — и потом жалуются, что токены не работают.

Модель User: стандартный допинг

Кидаем в User трейт:

use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}

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

Маршруты: вход, регистрация и "кто я?"

В routes/api.php лепим:

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

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

Да, выглядит как "Hello, world!" уровня авторизации. Но это и есть база, без которой OAuth2 у тебя так и останется красивым словом в README.

Контроллер регистрации: рутинный CRUD

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

        $user = User::create([
            'name' => $validatedData['name'],
            'email' => $validatedData['email'],
            'password' => Hash::make($validatedData['password']),
        ]);

        return response()->json(['message' => 'User registered successfully']);
    }
}

Да, код скучный, как бухгалтерский отчёт. Но если его не написать — никакой Passport тебя не спасёт.

Контроллер логина: с мясом

class LoginController extends Controller
{
    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');

        if (!Auth::attempt($credentials)) {
            return response()->json(['message' => 'Invalid credentials'], 401);
        }

        $token = Auth::user()->createToken('MyApp')->accessToken;

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

Вот тут появляется магия: токен. Не JWT, а специфический Laravel-овский мутант. Работает норм, но не обольщайся — в проде его всё равно придётся подкручивать под свои костыли.

Тесты: Postman, Insomnia или "крути curl"

Регай юзера, логинься, получай токен, тащи /user — проверяй, что всё взлетело. Если хочешь хардкора — curl в консоль, если норм — ставь Postman.

Вывод

Passport не волшебная кнопка "OAuth2 в один клик". Это удобный костыль, который экономит время, если знаешь, куда его вбить. Он снимает часть боли, но не всю. Например, если тебе нужен нормальный JWT с кастомными клеймами — забудь, придётся пилить самому или подключать что-то другое.

Но для старта, когда нужно быстро поднять авторизацию в API и раздать токены, — Passport жив. Главное не ждать, что это будет серебряная пуля. В Laravel серебряных пуль вообще не бывает — только ржавые гвозди и костыли.

Passport — это как армейский паёк: не вкусно, но жрать можно. Хочешь OAuth2 без боли — не выйдет. Хочешь быстро прикрутить токены — Passport норм, если готов к его тараканам.