diff --git a/README.md b/README.md index e3f0cad..d9befe4 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ ## Развертывание проекта 1. `composer install` 2. Настроить подключение к БД в `.env` + DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD 3. `php artisan migrate:fresh --seed` (команда развернет БД, создаст тестового юзера, 11 категорий и 40 сгенерированных событий). diff --git a/app/Console/Commands/ResetUserPassword.php b/app/Console/Commands/ResetUserPassword.php new file mode 100644 index 0000000..f60fd98 --- /dev/null +++ b/app/Console/Commands/ResetUserPassword.php @@ -0,0 +1,55 @@ +argument('email'); + $password = $this->argument('password'); + + // 1. Поиск пользователя + $user = User::where('email', $email)->first(); + + if (!$user) { + $this->error("Пользователь с email {$email} не найден."); + return Command::FAILURE; + } + + // 2. Генерация или использование переданного пароля + if (!$password) { + $password = Str::random(12); // Случайный пароль из 12 символов + } + + // 3. Обновление пароля в базе данных + $user->password = Hash::make($password); + $user->save(); + + // 4. Отзыв старых токенов (опционально, для безопасности) + $user->tokens()->delete(); + + // 5. Создание нового токена Sanctum + $token = $user->createToken('console_auth_token')->plainTextToken; + + // 6. Вывод результата в консоль + $this->info("Пароль для пользователя {$email} успешно изменен!"); + $this->line("Новый пароль: {$password}"); + $this->line("Новый Sanctum токен: {$token}"); + + return Command::SUCCESS; + } +} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php new file mode 100644 index 0000000..11964aa --- /dev/null +++ b/app/Http/Controllers/Auth/LoginController.php @@ -0,0 +1,66 @@ +all(), [ + 'email' => ['required', 'string', 'email'], + 'password' => ['required', 'string'], + ]); + + if ($validator->fails()) { + return response()->json([ + 'status' => 'error', + 'message' => 'Validation failed', + 'errors' => $validator->errors() + ], 422); + } + + // 2. Поиск пользователя + $user = User::where('email', $request->email)->first(); + + // 3. Проверка пароля + if (!$user || !Hash::check($request->password, $user->password)) { + return response()->json([ + 'status' => 'error', + 'message' => 'Invalid credentials' + ], 401); + } + + // 4. Генерация нового токена Sanctum + $token = $user->createToken('auth_token')->plainTextToken; + + return response()->json([ + 'status' => 'success', + 'message' => 'Logged in successfully', + 'data' => [ + 'user' => $user, + 'token_type' => 'Bearer', + 'access_token' => $token, + ] + ], 200); + } + + public function logout(Request $request) + { + // Удаление текущего токена, с которым пришел пользователь + $request->user()->currentAccessToken()->delete(); + + return response()->json([ + 'status' => 'success', + 'message' => 'Logged out successfully' + ], 200); + } +} diff --git a/routes/api.php b/routes/api.php index 69e13dc..849c2aa 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,10 +3,20 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; use App\Http\Controllers\GigsController; +use App\Http\Controllers\Auth\LoginController; + +// Публичный маршрут для входа +Route::post('/login', [ LoginController::class, 'login' ]); + +// Защищенный маршрут для выхода +Route::middleware('auth:sanctum')->group(function () { + Route::post('/logout', [ LoginController::class, 'logout' ]); +}); Route::get('/user', function (Request $request) { return $request->user(); })->middleware('auth:sanctum'); -Route::get('/gigs', [ GigsController::class, 'index' ]); +Route::get('/gigs', [ GigsController::class, 'index' ]) + ->middleware('auth:sanctum');