#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 را بررسی کرده، رمز جدید را با استفاده از الگوریتم هشینگ ایمن کرده و در پایگاه داده ثبت میکند.
- جستوجوی اپراتور فعال (
status=1) باpersonnel_idوotpیکسان. - بررسی زمان صدور OTP (
otp_issuing): اگر بیش از ۱۵ دقیقه گذشته باشد، رمز منقضی شده است (کد ۱۲۰۴). - اگر معتبر باشد: رمز عبور جدید (
$request->password) باHash::make()هش و ذخیره میشود. - ستون
otpاپراتور بهNULLتغییر داده میشود تا از استفاده مجدد جلوگیری شود. - ثبت رویداد
UpdatePasswordدرSystemLogدر صفsnailJob. - ارسال پیامک اطلاعرسانی موفقیتآمیز بودن تغییر رمز با جزئیات 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) در لایه فرانتاند.