احراز هویت
صفحات احراز هویت در قالب، رابط کامل و رفتار واقعی دارند اما به بکاند وصل نیستند. این بخش توضیح میدهد چه چیزی آماده است و برای وصل شدن چه باید کرد.
صفحات موجود
| صفحه | مسیر | نکته |
|---|---|---|
| ورود | auth/login.html | دو ستونه با پنل معرفی |
| ورود ساده | auth/login-minimal.html | بدون پنل کنار، تمرکز روی فرم |
| ورود دو ستونه | auth/login-split.html | چیدمان تبلیغاتی متفاوت |
| ثبتنام | auth/register.html | اعتبارسنجی کامل + قدرت گذرواژه |
| بازیابی گذرواژه | auth/forgot-password.html | ارسال پیوند |
| بازنشانی | auth/reset-password.html | گذرواژه جدید + تکرار |
| تأیید ایمیل | auth/verify-email.html | کد ۶ رقمی (OTP) |
| ورود دو مرحلهای | auth/two-factor.html | کد برنامه احراز هویت |
| قفل صفحه | auth/lock-screen.html | باز کردن با گذرواژه |
| خروج | auth/logout.html | تأیید خروج |
| خطای ورود | auth/error.html | حالت خطا |
همه صفحات از پوسته app-body--auth استفاده میکنند: بدون سایدبار، با دکمههای تم/جهت/زبان و میانبر «ورود به دمو».
چه چیزی واقعی کار میکند؟
- اعتبارسنجی همه فیلدها (ایمیل، شماره، کد ملی، گذرواژه، تطابق تکرار)
- ورودیهای کد یکبارمصرف با پرش خودکار بین خانهها و چسباندن کد
- حالت بارگذاری دکمه و پیامهای موفقیت/خطا
- انتقال به داشبورد پس از موفقیت (شبیهسازیشده)
- محدودسازی و دکمههای «ورود با گوگل/گیتهاب» که در دمو پیام اطلاع میدهند
وصل کردن به API واقعی
- یک سرویس احراز هویت بسازید:
// src/services/auth.service.js
import { call } from './client.js';
export const authService = {
login: (credentials) => call('post', 'auth/login', { body: credentials, resolver: () => ({ token: 'demo', user: { name: 'سارا محمدی' } }) }),
register: (payload) => call('post', 'auth/register', { body: payload }),
forgot: (email) => call('post', 'auth/forgot', { body: { email } }),
verify: (code) => call('post', 'auth/verify', { body: { code } }),
logout: () => call('post', 'auth/logout'),
};- در
src/js/pages/content.jsداخلinitAuth()، هندلر submit را به آن وصل کنید:
const { authService } = await import('../../services/auth.service.js');
on($('[data-auth-form]', node), 'submit', async (event) => {
event.preventDefault();
const form = event.currentTarget;
const button = $('[data-submit]', form);
button.classList.add('is-loading');
try {
const session = await authService.login(collectValues(form));
localStorage.setItem('nova:token', session.token);
window.location.assign('dashboards/analytics.html');
} catch (error) {
toast.danger('ورود ناموفق', error.message);
} finally {
button.classList.remove('is-loading');
}
});- توکن را در
client.jsبه هدرها اضافه کنید:
const headers = { 'Content-Type': 'application/json', ...(token ? { Authorization: `Bearer ${token}` } : {}) };- برای مسیرهای محافظتشده، در بالای
main.jsبررسی کنید که توکن وجود دارد و در غیر این صورت بهauth/login.htmlهدایت کنید. (در نسخه دمو، این بررسی غیرفعال است تا همه صفحات آزادانه قابل مشاهده باشند.)
نکات امنیتی
- گذرواژه را هرگز در
localStorageنگه ندارید؛ فقط توکن. - مسیرهای
auth/*را در سمت سرور هم محافظت کنید. - برای کد یکبارمصرف، انقضا و تعداد تلاش را در سرور کنترل کنید.
- در فرمهای واقعی از CSRF token استفاده کنید.