authController.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. const bcrypt = require('bcrypt');
  2. const jwt = require('jsonwebtoken');
  3. const pool = require('../config/db');
  4. const logger = require('../logger'); // 引入日志记录器
  5. exports.register = async (req, res) => {
  6. const { username, password } = req.body;
  7. logger.info(`开始处理用户注册请求: ${username}`);
  8. try {
  9. const [users] = await pool.promise().query('SELECT * FROM users WHERE username = ?', [username]);
  10. if (users.length > 0) {
  11. logger.warn(`用户注册失败:用户名 ${username} 已存在`); // 记录警告日志
  12. return res.status(400).json({ message: '用户名已存在' });
  13. }
  14. const saltRounds = 10;
  15. const hashedPassword = await bcrypt.hash(password, saltRounds);
  16. logger.debug('密码加密完成');
  17. const [result] = await pool.promise().query(
  18. 'INSERT INTO users (username, password) VALUES (?, ?)',
  19. [username, hashedPassword]
  20. );
  21. logger.info(`用户 ${username} 注册成功,用户ID:${result.insertId}`); // 记录成功日志
  22. res.status(201).json({
  23. success: true,
  24. message: '用户注册成功',
  25. userId: result.insertId
  26. });
  27. } catch (error) {
  28. logger.error('注册过程发生错误:', error); // 记录错误日志
  29. res.status(500).json({
  30. success: false,
  31. message: '注册失败,请稍后重试'
  32. });
  33. }
  34. };
  35. exports.login = async (req, res) => {
  36. const { username, password } = req.body;
  37. logger.info(`用户登录尝试: ${username}`);
  38. try {
  39. const [users] = await pool.promise().query('SELECT * FROM users WHERE username = ?', [username]);
  40. if (users.length === 0) {
  41. logger.warn(`登录失败:用户名 ${username} 不存在`); // 记录警告日志
  42. return res.status(401).json({
  43. success: false,
  44. message: '用户名或密码错误'
  45. });
  46. }
  47. const user = users[0];
  48. const isPasswordValid = await bcrypt.compare(password, user.password);
  49. if (!isPasswordValid) {
  50. logger.warn(`用户 ${username} 登录失败:密码错误`); // 记录警告日志
  51. return res.status(401).json({
  52. success: false,
  53. message: '用户名或密码错误'
  54. });
  55. }
  56. const token = jwt.sign({ userId: user.id }, 'your-secret-key', { expiresIn: '1h' });
  57. logger.info(`用户 ${username} 登录成功,生成新的token`);
  58. logger.debug(`用户 ${username} 的token将在1小时后过期`);
  59. res.json({
  60. success: true,
  61. token,
  62. message: '登录成功'
  63. });
  64. } catch (error) {
  65. logger.error('登录过程发生错误:', error); // 记录错误日志
  66. res.status(500).json({
  67. success: false,
  68. message: '登录失败,请稍后重试'
  69. });
  70. }
  71. };
  72. // 可以添加其他身份验证相关的方法
  73. exports.verifyToken = (req, res, next) => {
  74. const token = req.headers.authorization?.split(' ')[1];
  75. logger.debug('开始验证token');
  76. if (!token) {
  77. logger.warn('请求未携带token');
  78. return res.status(401).json({
  79. success: false,
  80. message: '未提供认证token'
  81. });
  82. }
  83. try {
  84. const decoded = jwt.verify(token, 'your-secret-key');
  85. req.userId = decoded.userId;
  86. logger.debug(`token验证成功,用户ID: ${decoded.userId}`);
  87. next();
  88. } catch (error) {
  89. logger.error('token验证失败:', error);
  90. res.status(401).json({
  91. success: false,
  92. message: 'token无效或已过期'
  93. });
  94. }
  95. };