fix(verification): remove hardcoded prefix from phone number in confirmation message
This commit is contained in:
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user