RewardApp / js /auth /authentication.js
Mhdeusi's picture
Update js/auth/authentication.js
718cfe1 verified
class Authentication {
constructor() {
this.tokenKey = 'authToken';
this.userKey = 'currentUser';
this.usersKey = 'appUsers';
}
generateToken(userId, username, role = 'student') {
// ایجاد توکن ساده برای محیط استاتیک
const tokenData = {
userId: userId,
username: username,
role: role,
timestamp: Date.now(),
exp: Date.now() + (7 * 24 * 60 * 60 * 1000) // 7 روز
};
return btoa(JSON.stringify(tokenData));
}
verifyToken(token) {
try {
const tokenData = JSON.parse(atob(token));
if (tokenData.exp > Date.now()) {
return tokenData;
} else {
this.logout();
return null;
}
} catch (error) {
console.error('Token verification failed:', error);
return null;
}
}
hashPassword(password) {
// هش ساده برای محیط توسعه - در تولید از روش امن‌تری استفاده شود
let hash = 0;
for (let i = 0; i < password.length; i++) {
const char = password.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = Math.abs(hash & hash);
}
return hash.toString();
}
setToken(token) {
localStorage.setItem(this.tokenKey, token);
}
getToken() {
return localStorage.getItem(this.tokenKey);
}
setCurrentUser(user) {
localStorage.setItem(this.userKey, JSON.stringify(user));
}
getCurrentUser() {
const userStr = localStorage.getItem(this.userKey);
return userStr ? JSON.parse(userStr) : null;
}
isAuthenticated() {
const token = this.getToken();
if (!token) return false;
const tokenData = this.verifyToken(token);
return tokenData !== null;
}
logout() {
localStorage.removeItem(this.tokenKey);
localStorage.removeItem(this.userKey);
}
// مدیریت کاربران در localStorage
initializeDefaultUsers() {
const existingUsers = this.getUsers();
if (Object.keys(existingUsers).length === 0) {
const defaultUsers = {
'1': {
userId: '1',
username: 'student',
email: 'student@example.com',
password: this.hashPassword('password123'),
role: 'student',
createdAt: new Date().toISOString(),
profile: {
fullName: 'دانشجوی نمونه',
bio: 'علاقمند به توسعه وب'
},
progress: {
totalScore: 0,
completedLessons: [],
currentLesson: 1
},
isActive: true
},
'2': {
userId: '2',
username: 'admin',
email: 'admin@example.com',
password: this.hashPassword('admin123'),
role: 'admin',
createdAt: new Date().toISOString(),
profile: {
fullName: 'مدیر سیستم',
bio: 'مدیر پلتفرم آموزشی'
},
progress: {
totalScore: 0,
completedLessons: [],
currentLesson: 1
},
isActive: true
}
};
this.saveUsers(defaultUsers);
}
}
getUsers() {
const usersStr = localStorage.getItem(this.usersKey);
return usersStr ? JSON.parse(usersStr) : {};
}
saveUsers(users) {
localStorage.setItem(this.usersKey, JSON.stringify(users));
}
registerUser(username, email, password, role = 'student', profile = {}) {
const users = this.getUsers();
// بررسی وجود کاربر
for (const userId in users) {
if (users[userId].username === username) {
return { success: false, message: 'نام کاربری already exists' };
}
if (users[userId].email === email) {
return { success: false, message: 'ایمیل already exists' };
}
}
// ایجاد کاربر جدید
const newUserId = Object.keys(users).length + 1;
const newUser = {
userId: newUserId.toString(),
username: username,
email: email,
password: this.hashPassword(password),
role: role,
createdAt: new Date().toISOString(),
profile: {
fullName: profile.fullName || '',
bio: profile.bio || '',
avatar: profile.avatar || ''
},
progress: {
totalScore: 0,
completedLessons: [],
currentLesson: 1,
achievements: []
},
isActive: true
};
users[newUserId] = newUser;
this.saveUsers(users);
return { success: true, user: newUser };
}
loginUser(username, password) {
const users = this.getUsers();
const hashedPassword = this.hashPassword(password);
console.log('🔐 Login attempt:', { username, hashedPassword }); // برای دیباگ
for (const userId in users) {
const user = users[userId];
console.log('📋 User in DB:', {
username: user.username,
password: user.password,
isActive: user.isActive
}); // برای دیباگ
if (user.username === username && user.password === hashedPassword && user.isActive) {
// ایجاد توکن
const token = this.generateToken(user.userId, user.username, user.role);
this.setToken(token);
this.setCurrentUser(user);
// به‌روزرسانی آخرین ورود
user.lastLogin = new Date().toISOString();
this.saveUsers(users);
// انتشار رویداد تغییر وضعیت
document.dispatchEvent(new CustomEvent('authStateChanged'));
return { success: true, user: user, token: token };
}
}
return { success: false, message: 'نام کاربری یا رمز عبور اشتباه است' };
}
updateUserProgress(userId, score = 0, completedLesson = null) {
const users = this.getUsers();
if (users[userId]) {
const user = users[userId];
if (score > 0) {
user.progress.totalScore = (user.progress.totalScore || 0) + score;
}
if (completedLesson && !user.progress.completedLessons.includes(completedLesson)) {
user.progress.completedLessons.push(completedLesson);
}
this.saveUsers(users);
return { success: true, progress: user.progress };
}
return { success: false, message: 'User not found' };
}
}
// ایجاد نمونه singleton
const authManager = new Authentication();