Skip to main content
#P1391

POST /api/auth/forgot/submit

Route Info

Method Endpoint Controller Middleware Purpose تگ Swagger
POST /api/auth/forgot/submit UserController@forgotSubmit domainAccess, ipTrust ثبت رمز عبور جدید پس از تأیید با رمز OTP (فراموشی رمز عبور) tags={"Auth"}

توضیح عملکرد (Function Logic)

این Endpoint فاز نهایی فرآیند بازیابی رمز عبور را مدیریت می‌کند. اپراتور باید پس از دریافت رمز یکبار مصرف (OTP) از طریق مسیر POST /api/auth/forgot/otp، آن را به همراه رمز عبور جدید به این مسیر ارسال کند. این مسیر اعتبار OTP را بررسی کرده، رمز جدید را با استفاده از الگوریتم هشینگ ایمن کرده و در پایگاه داده ثبت می‌کند.
  1. جست‌وجوی اپراتور فعال (status=1) با personnel_id و otp یکسان.
  2. بررسی زمان صدور OTP (otp_issuing): اگر بیش از ۱۵ دقیقه گذشته باشد، رمز منقضی شده است (کد ۱۲۰۴).
  3. اگر معتبر باشد: رمز عبور جدید ($request->password) با Hash::make() هش و ذخیره می‌شود.
  4. ستون otp اپراتور به NULL تغییر داده می‌شود تا از استفاده مجدد جلوگیری شود.
  5. ثبت رویداد UpdatePassword در SystemLog در صف snailJob.
  6. ارسال پیامک اطلاع‌رسانی موفقیت‌آمیز بودن تغییر رمز با جزئیات IP و زمان شمسی.

ورودی‌ها (Inputs)

پارامتر نوع داده الزامی توضیح
personnel_id string بله کد پرسنلی اپراتور فعال.
otp integer بله رمز یکبار مصرف ۸ رقمی صادر شده برای بازیابی.
password string بله رمز عبور جدید. (اعتبارسنجی پیچیدگی در لایه فرانت یا Middleware باید اعمال شود)
branch integer خیر شناسه‌ی شعبه برای ارسال اطلاع‌رسانی پیامکی.
نمونه درخواست:
POST /api/auth/forgot/submit
Content-Type: application/json

{
  "personnel_id": "P00999",
  "otp": "98765432",
  "password": "MyNewStrongPassword@123",
  "branch": 1
}

خروجی‌ها (Outputs)

به‌روزرسانی موفق رمز عبور

{
  "status": true,
  "time": 1731963561,
  "message": "کلمه عبور با موفقیت بروزرسانی شد."
}

رمز یکبار مصرف منقضی شده

{
  "status": false,
  "code": 1204,
  "message": "رمز یکبار مصرف منقضی شده است."
}

رمز یکبار مصرف نامعتبر

{
  "status": false,
  "code": 1205,
  "message": "رمز یکبار مصرف وارد شده معتبر نمی باشد."
}

هشینگ و به‌روزرسانی دیتابیس

رمز عبور قبل از ذخیره، با استفاده از متد Hash::make() هش می‌شود. در همان تراکنش، OTP استفاده شده با مقدار **NULL** جایگزین می‌گردد تا امنیت تضمین شود.
DB::table('operators')
    ->where('id', $operator->id)
    ->update([
        'password' => Hash::make($request->password), 
        'otp' => null
    ]);

ثبت رویداد در SystemLog

برای ردیابی موفقیت‌آمیز بودن تغییر رمز عبور و مبدأ آن، یک رویداد امنیتی در SystemLog ثبت می‌شود.
SystemLog::dispatch([
  "type" => "UpdatePassword",
  "data" => null,
  "goal" => $request->personnel_id,
  "by" => $operator->id,
  "agent" => $_SERVER['HTTP_USER_AGENT'],
  "ip" => getIP(),
  "datetime" => Carbon::now()
])->delay(now()->addMinutes(10))->onQueue('snailJob');

پیامک اطلاع‌رسانی امنیتی

بلافاصله پس از تغییر رمز، یک پیامک امنیتی به شماره موبایل کاربر ارسال می‌شود تا از اقدام صورت‌گرفته مطلع شود.
پیامک:
رمز عبور شما بروزرسانی گردید.
زمان: شنبه، ۲۷ آبان ۱۴۰۴ | ۱۳:۱۰:۲۰
📍 IP: 10.0.0.15
🌐 example.domain

وابستگی‌ها (Dependencies)

  • use Illuminate\Http\Request;
  • use Illuminate\Support\Facades\DB;
  • use Illuminate\Support\Facades\Hash;
  • use Carbon\Carbon;
  • use Morilog\Jalali\Jalalian;
  • use App\Jobs\SystemLog;
  • use App\Http\Controllers\StaticController;

تحلیل امنیتی

  • **اعتبار سنجی زمانی:** فقط ۱۵ دقیقه برای ثبت رمز جدید فرصت داده می‌شود.
  • **حذف OTP:** رمز یکبار مصرف بلافاصله پس از استفاده، با NULL جایگزین می‌شود.
  • **هشینگ رمز:** استفاده از Hash::make() برای جلوگیری از ذخیره‌سازی رمز به صورت متن ساده.
  • **هشدار به کاربر:** ارسال پیامک به موبایل کاربر، لایه امنیتی نهایی در صورت سرقت هویت را فراهم می‌کند.
  • **Middleware:** محافظت با domainAccess و ipTrust الزامی است.

پیوست نگهداری و توسعه بعدی

  • اعمال اعتبارسنجی پیچیدگی رمز (حداقل ۸ کاراکتر، کاراکترهای خاص) در سمت سرور به صورت Middleware یا Form Request.
  • اضافه‌کردن قابلیت جلوگیری از استفاده مجدد رمزهای عبور قبلی (Password History).
  • درخواست تأیید رمز جدید (confirm password) در لایه فرانت‌اند.