fix(verification): remove hardcoded prefix from phone number in confirmation message

This commit is contained in:
hamed
2026-06-21 13:35:05 +03:30
parent 9dd71ab2f5
commit 609479919a
2 changed files with 155 additions and 1 deletions
+154
View File
@@ -0,0 +1,154 @@
# فیکس دو باگ در فلو login
## پروژه
`nobat724_front`
## زمینه
دو باگ مستقل در فلو login/auth وجود دارد. یکی نمایشی (شماره اضافه) و یکی عملکردی (redirect به /login بعد از refresh صفحه).
## باگ ۱ — شماره موبایل با `09` اضافی
### مشکل
در `VerificationPage` پیام «کد تایید برای شماره X ارسال شد» نمایش می‌دهد `0909xxxxxxxxx` به جای `09xxxxxxxxx`.
### علت
`components/register/verificationPage/index.js` خط ۵۹:
```jsx
کد تایید برای شماره <span dir="ltr">09{num}</span> ارسال شد.
```
اما `num` از state والد (`RegisterPage`) می‌آید که کل شماره را نگه می‌دارد (شامل `09`). `validatePhoneNumber` در `helper/index.js` شماره را با `^09\d{9}$` validate می‌کند — پس `num` قبلاً `09` دارد. hard-code کردن `09` اضافه → double prefix.
### فیکس
```jsx
// فعلی (اشتباه):
کد تایید برای شماره <span dir="ltr">09{num}</span> ارسال شد.
// درست:
کد تایید برای شماره <span dir="ltr">{num}</span> ارسال شد.
```
## باگ ۲ — redirect به `/login` بعد از refresh صفحه
### مشکل
بعد از login موفق و رفتن به `/dashboard`، refresh صفحه → redirect به `/login`.
### علت احتمالی
`dashboard/page.js` خط ۲۲:
```js
if (!ability.can("access", "Dashboard") || !token) {
return redirect("/login");
}
```
دو شرط می‌تواند fail شود:
**شرط اول**`ability.can("access", "Dashboard")`:
`getUser()` در `lib/auth.js` چک می‌کند:
```js
const isAuthenticated = cookieStore.get("refresh_token") && cookieStore.get("userInfo");
```
`refresh_token` = HttpOnly (از `/api/auth/token` server route) → OK.
`userInfo` = js-cookie از client در `SendReq.js` → اگر این cookie درست سِت نشده باشد، `getUser()` null برمی‌گرداند.
**شرط دوم**`!token`:
`getServerAccessToken()` از `refresh_token` HttpOnly token جدید می‌گیرد با `POST /oauth/token/refresh`. اگر این endpoint fail کند یا `refresh_token` expire شده باشد → `null` → redirect.
### فایل‌های مرتبط
| فایل | نقش |
|------|-----|
| `components/register/verificationPage/index.js` | خط ۵۹ — باگ ۱ |
| `components/register/verificationPage/SendReq.js` | سِت کردن cookies بعد از login |
| `app/api/auth/token/route.js` | سِت کردن `refresh_token` HttpOnly |
| `lib/auth.js` | `getUser()` — چک `refresh_token` + `userInfo` |
| `lib/serverToken.js` | `getServerAccessToken()` — refresh با `oauth/token/refresh` |
| `app/dashboard/page.js` | guard: `!ability || !token` → redirect |
| `lib/refreshCookie.js` | `setRefreshCookie()` |
### وضعیت فعلی
```js
// SendReq.js — بعد از login موفق
const getInfo = (token, cookieOptions) => {
request.getUserInfo(...).then((res) => {
const userInfo = { ...profile, username: profile.mobile_number };
Cookies.set("userInfo", JSON.stringify(userInfo), cookieOptions);
Cookies.set("uuid", profile.uuid, cookieOptions);
if (setStep) {
setStep(3);
} else {
window.location.href = "/"; // ← به / می‌رود، نه /dashboard
}
});
};
```
```js
// lib/serverToken.js
const res = await axiosInstance.post(
`${process.env.NEXT_PUBLIC_API_URL}/oauth/token/refresh`,
{ refresh_token: refreshToken },
...
);
return res.data?.access_token ?? null;
```
### وظایف برای دیباگ و فیکس
#### ۱. فیکس باگ ۱ (قطعی)
در `components/register/verificationPage/index.js` خط ۵۹ `09` را حذف کن:
```jsx
// قبل:
<span dir="ltr">09{num}</span>
// بعد:
<span dir="ltr">{num}</span>
```
#### ۲. بررسی `userInfo` cookie
در `SendReq.js` بررسی کن `cookieOptions` درست است:
- در localhost: `domain` = undefined (✓ فعلاً چنین است)
- `sameSite: "lax"` در Next.js 15 App Router با server component ممکن است مشکل داشته باشد
اگر `userInfo` cookie سِت نمی‌شود، `getUser()` null برمی‌گرداند → `ability.can("access","Dashboard")` = false → redirect.
برای تشخیص: بعد از login در DevTools → Application → Cookies چک کن `userInfo` و `refresh_token` هر دو موجودند.
#### ۳. بررسی endpoint `/oauth/token/refresh`
در `lib/serverToken.js` چک کن آیا endpoint درست است:
```js
POST /oauth/token/refresh
body: { refresh_token: "..." }
```
با curl یا DevTools Network تأیید کن این endpoint در backend موجود است و `refresh_token` valid برمی‌گرداند. اگر ۴۰۱/۴۰۴ → `getServerAccessToken()` null برمی‌گرداند → `!token` → redirect.
#### ۴. redirect بعد از login
فعلاً `window.location.href = "/"` به صفحه خانه می‌رود. اگر هدف dashboard است:
```js
window.location.href = "/dashboard";
```
اما اگر کوکی‌ها درست سِت شده باشند، redirect به `/` و سپس دستی رفتن به `/dashboard` باید کار کند.
## نکات مهم
- `refresh_token` = HttpOnly → فقط از server قابل خواندن. از DevTools مستقیم قابل مشاهده نیست اما در Network tab response headers قابل دیدن است.
- `getUser()` هر دو `refresh_token` AND `userInfo` می‌خواهد — اگر فقط یکی موجود باشد، null برمی‌گرداند.
- `getServerAccessToken()` هر بار صفحه load می‌شود یک refresh token request می‌زند — اگر backend rate-limit داشته باشد یا endpoint اشتباه باشد، fail می‌شود.
- در DEV_MODE بررسی باگ ۲ را با Network tab و Console انجام بده.
@@ -56,7 +56,7 @@ function VerificationPage({ setIsSendMsg, uuid, link, setUuid, num, setStep }) {
کد تایید را وارد نمایید
</p>
<p className="text-[#616161] mt-[16px] sm:mt-[19px] md:mt-[22px] lg:mt-[24px] text-[14px] font-normal text-right">
کد تایید برای شماره <span dir="ltr">09{num}</span> ارسال شد.
کد تایید برای شماره <span dir="ltr">{num}</span> ارسال شد.
</p>
<div className="mt-[26px] sm:mt-[28px] md:mt-[30px] lg:mt-[32px] mb-[56px] sm:mb-[47px] md:mb-[38px] lg:mb-[30px]">
<div className="mb-[27px]" dir="ltr">