Added login controller and reset_user_password console script
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
## Развертывание проекта
|
## Развертывание проекта
|
||||||
1. `composer install`
|
1. `composer install`
|
||||||
2. Настроить подключение к БД в `.env`
|
2. Настроить подключение к БД в `.env`
|
||||||
|
DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD
|
||||||
3. `php artisan migrate:fresh --seed`
|
3. `php artisan migrate:fresh --seed`
|
||||||
(команда развернет БД, создаст тестового юзера, 11 категорий и 40 сгенерированных событий).
|
(команда развернет БД, создаст тестового юзера, 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
@@ -3,10 +3,20 @@
|
|||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
use App\Http\Controllers\GigsController;
|
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) {
|
Route::get('/user', function (Request $request) {
|
||||||
return $request->user();
|
return $request->user();
|
||||||
})->middleware('auth:sanctum');
|
})->middleware('auth:sanctum');
|
||||||
|
|
||||||
|
|
||||||
Route::get('/gigs', [ GigsController::class, 'index' ]);
|
Route::get('/gigs', [ GigsController::class, 'index' ])
|
||||||
|
->middleware('auth:sanctum');
|
||||||
|
|||||||
Reference in New Issue
Block a user