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 норм, если готов к его тараканам.
0 комментариев