auth.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /**
  2. * 认证相关路由 - 使用SQLite数据库
  3. */
  4. const express = require('express');
  5. const router = express.Router();
  6. const userServiceDB = require('../services/userServiceDB');
  7. const logger = require('../logger');
  8. const { requireLogin } = require('../middleware/auth');
  9. // 登录验证
  10. router.post('/login', async (req, res) => {
  11. const { username, password, captcha } = req.body;
  12. // 验证码检查
  13. if (req.session.captcha !== parseInt(captcha)) {
  14. logger.warn(`Captcha verification failed for user: ${username}`);
  15. return res.status(401).json({ error: '验证码错误' });
  16. }
  17. try {
  18. // 使用数据库认证
  19. const user = await userServiceDB.validateUser(username, password);
  20. if (!user) {
  21. logger.warn(`Login failed for user: ${username}`);
  22. return res.status(401).json({ error: '用户名或密码错误' });
  23. }
  24. // 更新登录信息
  25. await userServiceDB.updateUserLoginInfo(username);
  26. logger.info(`用户 ${username} 登录成功`);
  27. // 设置会话
  28. req.session.user = { username: user.username };
  29. // 确保服务器启动时间已设置
  30. if (!global.serverStartTime) {
  31. global.serverStartTime = Date.now();
  32. logger.warn(`登录时设置服务器启动时间: ${global.serverStartTime}`);
  33. }
  34. res.json({
  35. success: true,
  36. serverStartTime: global.serverStartTime
  37. });
  38. } catch (error) {
  39. logger.error('登录失败:', error);
  40. res.status(500).json({ error: '登录处理失败', details: error.message });
  41. }
  42. });
  43. // 注销
  44. router.post('/logout', (req, res) => {
  45. req.session.destroy(err => {
  46. if (err) {
  47. logger.error('销毁会话失败:', err);
  48. return res.status(500).json({ error: 'Failed to logout' });
  49. }
  50. res.clearCookie('connect.sid');
  51. logger.info('用户已退出登录');
  52. res.json({ success: true });
  53. });
  54. });
  55. // 修改密码
  56. router.post('/change-password', requireLogin, async (req, res) => {
  57. const { currentPassword, newPassword } = req.body;
  58. // 密码复杂度校验
  59. const passwordRegex = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[.,\-_+=()[\]{}|\\;:'"<>?/@$!%*#?&])[A-Za-z\d.,\-_+=()[\]{}|\\;:'"<>?/@$!%*#?&]{8,16}$/;
  60. if (!passwordRegex.test(newPassword)) {
  61. return res.status(400).json({ error: 'Password must be 8-16 characters long and contain at least one letter, one number, and one special character' });
  62. }
  63. try {
  64. // 使用SQLite数据库服务修改密码
  65. await userServiceDB.changePassword(req.session.user.username, currentPassword, newPassword);
  66. res.json({ success: true });
  67. } catch (error) {
  68. logger.error('修改密码失败:', error);
  69. res.status(500).json({ error: '修改密码失败', details: error.message });
  70. }
  71. });
  72. // 获取用户信息
  73. router.get('/user-info', requireLogin, async (req, res) => {
  74. try {
  75. const userStats = await userServiceDB.getUserStats(req.session.user.username);
  76. res.json(userStats);
  77. } catch (error) {
  78. logger.error('获取用户信息失败:', error);
  79. res.status(500).json({ error: '获取用户信息失败', details: error.message });
  80. }
  81. });
  82. // 生成验证码
  83. router.get('/captcha', (req, res) => {
  84. const num1 = Math.floor(Math.random() * 10);
  85. const num2 = Math.floor(Math.random() * 10);
  86. const captcha = `${num1} + ${num2} = ?`;
  87. req.session.captcha = num1 + num2;
  88. // 确保serverStartTime已初始化
  89. if (!global.serverStartTime) {
  90. global.serverStartTime = Date.now();
  91. logger.warn(`初始化服务器启动时间: ${global.serverStartTime}`);
  92. }
  93. res.json({
  94. captcha,
  95. serverStartTime: global.serverStartTime
  96. });
  97. });
  98. // 检查会话状态
  99. router.get('/check-session', (req, res) => {
  100. // 如果global.serverStartTime不存在,创建一个
  101. if (!global.serverStartTime) {
  102. global.serverStartTime = Date.now();
  103. logger.warn(`设置服务器启动时间: ${global.serverStartTime}`);
  104. }
  105. if (req.session && req.session.user) {
  106. return res.json({
  107. success: true,
  108. user: {
  109. username: req.session.user.username,
  110. role: req.session.user.role,
  111. },
  112. serverStartTime: global.serverStartTime // 返回服务器启动时间
  113. });
  114. }
  115. return res.status(401).json({
  116. success: false,
  117. message: '未登录',
  118. serverStartTime: global.serverStartTime // 即使未登录也返回服务器时间
  119. });
  120. });
  121. logger.success('✓ 认证路由已加载');
  122. // 导出路由
  123. module.exports = router;