Added login controller and reset_user_password console script

This commit is contained in:
amikhaylov
2026-05-27 11:38:11 +03:00
parent ac47c7114d
commit d8d49f7bba
4 changed files with 133 additions and 1 deletions
+1
View File
@@ -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 сгенерированных событий).
@@ -0,0 +1,55 @@
<?php
declare(strict_types=1);
namespace App\Console\Commands;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class ResetUserPassword extends Command
{
// Название и аргументы команды (email обязательный, password — опциональный)
protected $signature = 'user:reset-password {email} {password?}';
// Описание команды для списка php artisan
protected $description = 'Сбрасывает пароль пользователя по email и генерирует новый API-токен Sanctum';
public function handle()
{
$email = $this->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("Новый пароль: <comment>{$password}</comment>");
$this->line("Новый Sanctum токен: <comment>{$token}</comment>");
return Command::SUCCESS;
}
}
@@ -0,0 +1,66 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
class LoginController extends Controller
{
public function login(Request $request)
{
// 1. Валидация JSON-данных
$validator = Validator::make($request->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);
}
}
+11 -1
View File
@@ -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');