validate([ 'username' => 'required|string', 'password' => 'required|string', ]); $throttleKey = 'admin-login:' . strtolower($request->string('username')->toString()) . '|' . $request->ip(); if (RateLimiter::tooManyAttempts($throttleKey, self::LOGIN_MAX_ATTEMPTS)) { return response()->json([ 'error' => true, 'message' => 'Bạn đã đăng nhập sai quá nhiều lần. Vui lòng thử lại sau ít phút.', ], 429); } $token = Auth::guard('admin')->attempt($request->only('username', 'password')); if (!$token) { RateLimiter::hit($throttleKey, self::LOGIN_DECAY_SECONDS); $this->activityLogger->log( event: 'login_failed', logName: 'auth', description: '[admin] Đăng nhập thất bại với username: ' . $request->username, ); return response()->json([ 'error' => true, 'message' => 'Thông tin đăng nhập không chính xác.', ], 401); } RateLimiter::clear($throttleKey); $user = Auth::guard('admin')->user(); Auth::guard('admin')->getProvider()->rehashPasswordIfRequired($user, $request->only('password')); $this->activityLogger->logAuth('login', 'admin', $user->id, $user->username ?? $user->email); return response()->json([ 'error' => false, 'data' => [ 'token' => $token, 'token_type' => 'bearer', 'expires_in' => config('jwt.ttl') * 60, 'user' => new AdminUserResource($user), ], ]); } public function me(): JsonResponse { $user = Auth::guard('admin')->user(); return response()->json([ 'error' => false, 'data' => ['user' => new AdminUserResource($user)], ]); } public function updateProfile(UpdateProfileRequest $request): JsonResponse { $user = Auth::guard('admin')->user(); $user->update($request->validated()); return response()->json([ 'error' => false, 'message' => 'Cập nhật hồ sơ thành công.', 'data' => ['user' => new AdminUserResource($user->fresh())], ]); } public function updatePassword(UpdateAdminPasswordRequest $request): JsonResponse { $user = Auth::guard('admin')->user(); $user->update([ 'password' => Hash::make($request->string('password')->toString()), ]); $this->activityLogger->logAuth( 'password_changed', 'admin', $user->id, $user->username ?? $user->email, ); return response()->json([ 'error' => false, 'message' => 'Đổi mật khẩu thành công.', ]); } public function refresh(): JsonResponse { try { $newToken = JWTAuth::parseToken()->refresh(); $user = JWTAuth::setToken($newToken)->toUser(); return response()->json([ 'error' => false, 'data' => [ 'token' => $newToken, 'token_type' => 'bearer', 'expires_in' => config('jwt.ttl') * 60, 'user' => new AdminUserResource($user), ], ]); } catch (JWTException) { return response()->json([ 'error' => true, 'message' => 'Không thể làm mới phiên đăng nhập. Vui lòng đăng nhập lại.', ], 401); } } public function logout(): JsonResponse { $user = Auth::guard('admin')->user(); if ($user) { $this->activityLogger->logAuth('logout', 'admin', $user->id, $user->username ?? $user->email); } Auth::guard('admin')->logout(); return response()->json([ 'error' => false, 'message' => 'Đã đăng xuất thành công.', ]); } }