samlax12 commited on
Commit
006ee19
·
verified ·
1 Parent(s): 5349b9c

Upload 18 files

Browse files
config/auth.js CHANGED
@@ -1,12 +1,22 @@
1
  const jwt = require('jsonwebtoken');
 
2
 
3
  // 生成 JWT Token
4
  const generateToken = (userId) => {
5
- return jwt.sign(
6
- { id: userId },
7
- process.env.JWT_SECRET,
8
- { expiresIn: process.env.JWT_EXPIRE || '24h' }
9
- );
 
 
 
 
 
 
 
 
 
10
  };
11
 
12
  module.exports = { generateToken };
 
1
  const jwt = require('jsonwebtoken');
2
+ const logger = require('../utils/logger');
3
 
4
  // 生成 JWT Token
5
  const generateToken = (userId) => {
6
+ try {
7
+ // 确保 userId 是字符串类型
8
+ const userIdStr = String(userId);
9
+ const token = jwt.sign(
10
+ { id: userIdStr },
11
+ process.env.JWT_SECRET,
12
+ { expiresIn: process.env.JWT_EXPIRE || '24h' }
13
+ );
14
+ logger.info(`为用户 ${userIdStr} 生成令牌成功`);
15
+ return token;
16
+ } catch (error) {
17
+ logger.error(`生成令牌失败: ${error.message}`);
18
+ throw error;
19
+ }
20
  };
21
 
22
  module.exports = { generateToken };
config/db.js CHANGED
@@ -22,25 +22,30 @@ const connectDB = async () => {
22
  const createDefaultAdmin = async () => {
23
  try {
24
  const User = require('../models/User');
25
- const bcrypt = require('bcryptjs');
26
-
 
 
 
 
 
27
  // 检查是否已存在管理员用户
28
  const adminExists = await User.findOne({ username: process.env.ADMIN_USERNAME });
29
 
30
- if (!adminExists && process.env.ADMIN_USERNAME && process.env.ADMIN_PASSWORD) {
31
- // 创建管理员用户
32
- const hashedPassword = await bcrypt.hash(process.env.ADMIN_PASSWORD, 10);
33
-
34
- await User.create({
35
  username: process.env.ADMIN_USERNAME,
36
- password: hashedPassword,
37
  isAdmin: true
38
  });
39
 
40
- logger.info('Default admin user created');
 
 
41
  }
42
  } catch (error) {
43
- logger.error(`Error creating default admin: ${error.message}`);
44
  }
45
  };
46
 
 
22
  const createDefaultAdmin = async () => {
23
  try {
24
  const User = require('../models/User');
25
+
26
+ // 先检查环境变量
27
+ if (!process.env.ADMIN_USERNAME || !process.env.ADMIN_PASSWORD) {
28
+ logger.warn('管理员账户环境变量未设置,跳过默认管理员创建');
29
+ return;
30
+ }
31
+
32
  // 检查是否已存在管理员用户
33
  const adminExists = await User.findOne({ username: process.env.ADMIN_USERNAME });
34
 
35
+ if (!adminExists) {
36
+ // 不手动哈希密码,让模型的中间件处理加密
37
+ const admin = await User.create({
 
 
38
  username: process.env.ADMIN_USERNAME,
39
+ password: process.env.ADMIN_PASSWORD, // 直接使用原始密码
40
  isAdmin: true
41
  });
42
 
43
+ logger.info(`默认管理员创建成功: ${admin._id}`);
44
+ } else {
45
+ logger.info('管理员账户已存在,无需创建');
46
  }
47
  } catch (error) {
48
+ logger.error(`创建默认管理员出错: ${error.message}`);
49
  }
50
  };
51
 
controllers/authController.js CHANGED
@@ -1,6 +1,7 @@
1
  const asyncHandler = require('express-async-handler');
2
  const User = require('../models/User');
3
  const { generateToken } = require('../config/auth');
 
4
 
5
  // @desc 用户注册
6
  // @route POST /api/auth/register
@@ -41,18 +42,33 @@ const registerUser = asyncHandler(async (req, res) => {
41
  const loginUser = asyncHandler(async (req, res) => {
42
  const { username, password } = req.body;
43
 
 
 
44
  // 查找用户
45
  const user = await User.findOne({ username });
 
 
 
 
 
 
 
 
 
 
46
 
47
- // 检查用户和密码
48
- if (user && (await user.matchPassword(password))) {
 
 
49
  res.json({
50
  _id: user._id,
51
  username: user.username,
52
  isAdmin: user.isAdmin,
53
- token: generateToken(user._id),
54
  });
55
  } else {
 
56
  res.status(401);
57
  throw new Error('用户名或密码错误');
58
  }
 
1
  const asyncHandler = require('express-async-handler');
2
  const User = require('../models/User');
3
  const { generateToken } = require('../config/auth');
4
+ const logger = require('../utils/logger');
5
 
6
  // @desc 用户注册
7
  // @route POST /api/auth/register
 
42
  const loginUser = asyncHandler(async (req, res) => {
43
  const { username, password } = req.body;
44
 
45
+ logger.info(`登录尝试: ${username}`);
46
+
47
  // 查找用户
48
  const user = await User.findOne({ username });
49
+
50
+ if (!user) {
51
+ logger.warn(`用户不存在: ${username}`);
52
+ res.status(401);
53
+ throw new Error('用户名或密码错误');
54
+ }
55
+
56
+ // 检查密码
57
+ const isMatch = await user.matchPassword(password);
58
+ logger.info(`密码匹配结果: ${isMatch}`);
59
 
60
+ if (isMatch) {
61
+ const token = generateToken(user._id);
62
+ logger.info(`登录成功: ${username}`);
63
+
64
  res.json({
65
  _id: user._id,
66
  username: user.username,
67
  isAdmin: user.isAdmin,
68
+ token: token,
69
  });
70
  } else {
71
+ logger.warn(`密码不匹配: ${username}`);
72
  res.status(401);
73
  throw new Error('用户名或密码错误');
74
  }
middleware/auth.js CHANGED
@@ -1,6 +1,7 @@
1
  const jwt = require('jsonwebtoken');
2
  const asyncHandler = require('express-async-handler');
3
  const User = require('../models/User');
 
4
 
5
  // 保护路由 - 验证 JWT Token
6
  const protect = asyncHandler(async (req, res, next) => {
@@ -11,26 +12,29 @@ const protect = asyncHandler(async (req, res, next) => {
11
  try {
12
  // 获取 token
13
  token = req.headers.authorization.split(' ')[1];
 
14
 
15
  // 验证 token
16
  const decoded = jwt.verify(token, process.env.JWT_SECRET);
 
17
 
18
  // 获取用户并添加到请求对象中,不包含密码
19
  req.user = await User.findById(decoded.id).select('-password');
20
 
21
  if (!req.user) {
 
22
  res.status(401);
23
  throw new Error('未授权,用户不存在');
24
  }
25
 
26
  next();
27
  } catch (error) {
 
28
  res.status(401);
29
  throw new Error('未授权,token 无效');
30
  }
31
- }
32
-
33
- if (!token) {
34
  res.status(401);
35
  throw new Error('未授权,未提供 token');
36
  }
 
1
  const jwt = require('jsonwebtoken');
2
  const asyncHandler = require('express-async-handler');
3
  const User = require('../models/User');
4
+ const logger = require('../utils/logger');
5
 
6
  // 保护路由 - 验证 JWT Token
7
  const protect = asyncHandler(async (req, res, next) => {
 
12
  try {
13
  // 获取 token
14
  token = req.headers.authorization.split(' ')[1];
15
+ logger.info(`验证令牌: ${token.substring(0, 15)}...`);
16
 
17
  // 验证 token
18
  const decoded = jwt.verify(token, process.env.JWT_SECRET);
19
+ logger.info(`令牌有效,用户ID: ${decoded.id}`);
20
 
21
  // 获取用户并添加到请求对象中,不包含密码
22
  req.user = await User.findById(decoded.id).select('-password');
23
 
24
  if (!req.user) {
25
+ logger.warn(`令牌有效但用户不存在: ${decoded.id}`);
26
  res.status(401);
27
  throw new Error('未授权,用户不存在');
28
  }
29
 
30
  next();
31
  } catch (error) {
32
+ logger.error(`令牌验证失败: ${error.message}`);
33
  res.status(401);
34
  throw new Error('未授权,token 无效');
35
  }
36
+ } else {
37
+ logger.warn(`未提供认证令牌: ${req.originalUrl}`);
 
38
  res.status(401);
39
  throw new Error('未授权,未提供 token');
40
  }
models/User.js CHANGED
@@ -26,17 +26,27 @@ const userSchema = new mongoose.Schema(
26
 
27
  // 密码匹配方法
28
  userSchema.methods.matchPassword = async function (enteredPassword) {
29
- return await bcrypt.compare(enteredPassword, this.password);
 
 
 
 
 
30
  };
31
 
32
  // 保存前加密密码
33
  userSchema.pre('save', async function (next) {
34
  if (!this.isModified('password')) {
35
- next();
36
  }
37
 
38
- const salt = await bcrypt.genSalt(10);
39
- this.password = await bcrypt.hash(this.password, salt);
 
 
 
 
 
40
  });
41
 
42
  const User = mongoose.model('User', userSchema);
 
26
 
27
  // 密码匹配方法
28
  userSchema.methods.matchPassword = async function (enteredPassword) {
29
+ try {
30
+ return await bcrypt.compare(enteredPassword, this.password);
31
+ } catch (error) {
32
+ console.error('密码比较出错:', error);
33
+ return false;
34
+ }
35
  };
36
 
37
  // 保存前加密密码
38
  userSchema.pre('save', async function (next) {
39
  if (!this.isModified('password')) {
40
+ return next(); // 修复:确保不重复加密
41
  }
42
 
43
+ try {
44
+ const salt = await bcrypt.genSalt(10);
45
+ this.password = await bcrypt.hash(this.password, salt);
46
+ next();
47
+ } catch (error) {
48
+ next(error);
49
+ }
50
  });
51
 
52
  const User = mongoose.model('User', userSchema);
server.js CHANGED
@@ -10,6 +10,20 @@ const logger = require('./utils/logger');
10
  // 加载环境变量
11
  dotenv.config();
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  // 初始化 Express 应用
14
  const app = express();
15
 
 
10
  // 加载环境变量
11
  dotenv.config();
12
 
13
+ // 验证关键环境变量
14
+ const requiredEnvVars = ['MONGODB_URI', 'JWT_SECRET', 'ADMIN_USERNAME', 'ADMIN_PASSWORD'];
15
+ const missingEnvVars = requiredEnvVars.filter(envVar => !process.env[envVar]);
16
+
17
+ if (missingEnvVars.length > 0) {
18
+ logger.error(`缺少必要的环境变量: ${missingEnvVars.join(', ')}`);
19
+ process.exit(1);
20
+ }
21
+
22
+ logger.info('环境变量加载成功');
23
+ logger.info(`NODE_ENV: ${process.env.NODE_ENV}`);
24
+ logger.info(`ADMIN_USERNAME: ${process.env.ADMIN_USERNAME}`);
25
+ logger.info(`JWT_SECRET: ${process.env.JWT_SECRET ? '已设置' : '未设置'}`);
26
+
27
  // 初始化 Express 应用
28
  const app = express();
29