mb672038's picture
می خوام که واقعا برنامه لاگین داشته باشه و ورود همچنین با توضیحا نی که دادم نمی خوام نمایشی باشه می خوام واقعی کار کنه
aa06156 verified
Raw
History Blame Contribute Delete
4.88 kB
const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const User = require('../models/User');
const router = express.Router();
// Register
router.post('/register', async (req, res) => {
try {
const { username, email, password, fullName } = req.body;
// Validate input
if (!username || !email || !password || !fullName) {
return res.status(400).json({ message: 'همه فیلدهای ضروری را پر کنید' });
}
// Validate email format
const emailRegex = /\S+@\S+\.\S+/;
if (!emailRegex.test(email)) {
return res.status(400).json({ message: 'فرمت ایمیل نامعتبر است' });
}
// Check if user exists
let user = await User.findOne({ $or: [{ email }, { username }] });
if (user) {
return res.status(400).json({
message: 'کاربر با این ایمیل یا نام کاربری وجود دارد'
});
}
// Create new user
user = new User({
username,
email,
password,
profile: { fullName }
});
await user.save();
// Generate JWT token
const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, {
expiresIn: '30d'
});
// Set cookie
res.cookie('token', token, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
maxAge: 30 * 24 * 60 * 60 * 1000, // 30 days
sameSite: 'strict'
});
res.status(201).json({
success: true,
token,
user: {
id: user._id,
username,
email,
role: user.role,
fullName
}
});
} catch (err) {
console.error('Registration error:', err);
res.status(500).json({
success: false,
message: 'خطای سرور. لطفا دوباره تلاش کنید'
});
}
});
// Login
router.post('/login', async (req, res) => {
try {
const { email, password } = req.body;
// Validate input
if (!email || !password) {
return res.status(400).json({ message: 'ایمیل و رمز عبور را وارد کنید' });
}
// Find user
const user = await User.findOne({ email });
if (!user) {
return res.status(401).json({
success: false,
message: 'ایمیل یا رمز عبور اشتباه است'
});
}
// Check password
const isMatch = await user.comparePassword(password);
if (!isMatch) {
return res.status(401).json({
success: false,
message: 'ایمیل یا رمز عبور اشتباه است'
});
}
// Generate JWT token
const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, {
expiresIn: '30d'
});
// Set cookie
res.cookie('token', token, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
maxAge: 30 * 24 * 60 * 60 * 1000, // 30 days
sameSite: 'strict'
});
res.json({
success: true,
token,
user: {
id: user._id,
username: user.username,
email: user.email,
role: user.role,
fullName: user.profile?.fullName || ''
}
});
} catch (err) {
console.error('Login error:', err);
res.status(500).json({
success: false,
message: 'خطای سرور. لطفا دوباره تلاش کنید'
});
}
});
// Get current user
router.get('/me', async (req, res) => {
try {
const token = req.cookies.token || req.headers.authorization?.split(' ')[1];
if (!token) {
return res.status(401).json({
success: false,
message: 'Not authorized'
});
}
const decoded = jwt.verify(token, process.env.JWT_SECRET);
const user = await User.findById(decoded.id).select('-password');
if (!user) {
return res.status(404).json({
success: false,
message: 'User not found'
});
}
res.json({
success: true,
user
});
} catch (err) {
console.error('Auth error:', err);
res.status(401).json({
success: false,
message: 'Not authorized'
});
}
});
// Logout
router.get('/logout', (req, res) => {
res.clearCookie('token');
res.json({
success: true,
message: 'Logged out successfully'
});
});
// Auth middleware
function auth(req, res, next) {
const token = req.cookies.token || req.headers.authorization?.split(' ')[1];
if (!token) {
return res.status(401).json({
success: false,
message: 'Not authorized'
});
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (err) {
console.error('Auth error:', err);
res.status(401).json({
success: false,
message: 'Not authorized'
});
}
}
module.exports = {
router,
auth
};