auth.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. const express = require('express');
  2. const router = express.Router();
  3. const { pool } = require('../config/db');
  4. const bcrypt = require('bcryptjs');
  5. const jwt = require('jsonwebtoken');
  6. // 用户登录
  7. router.post('/login', async (req, res) => {
  8. try {
  9. const { username, password } = req.body;
  10. // 查询用户
  11. const [users] = await pool.query(
  12. 'SELECT * FROM users WHERE username = ?',
  13. [username]
  14. );
  15. if (users.length === 0) {
  16. return res.status(401).json({ error: 'Invalid credentials' });
  17. }
  18. const user = users[0];
  19. // 验证密码
  20. const isMatch = await bcrypt.compare(password, user.password_hash);
  21. if (!isMatch) {
  22. return res.status(401).json({ error: 'Invalid credentials' });
  23. }
  24. // 生成JWT
  25. const token = jwt.sign(
  26. { id: user.id, role: user.role },
  27. process.env.JWT_SECRET,
  28. { expiresIn: '8h' }
  29. );
  30. res.json({
  31. token,
  32. user: {
  33. id: user.id,
  34. username: user.username,
  35. role: user.role,
  36. fullName: user.full_name
  37. }
  38. });
  39. } catch (error) {
  40. console.error('Login error:', error);
  41. res.status(500).json({ error: 'Server error' });
  42. }
  43. });
  44. // 获取当前用户信息
  45. router.get('/me', async (req, res) => {
  46. try {
  47. const token = req.headers.authorization?.split(' ')[1];
  48. if (!token) {
  49. return res.status(401).json({ error: 'Not authenticated' });
  50. }
  51. const decoded = jwt.verify(token, process.env.JWT_SECRET);
  52. const [users] = await pool.query(
  53. 'SELECT id, username, email, full_name, role FROM users WHERE id = ?',
  54. [decoded.id]
  55. );
  56. if (users.length === 0) {
  57. return res.status(404).json({ error: 'User not found' });
  58. }
  59. res.json(users[0]);
  60. } catch (error) {
  61. console.error('Get me error:', error);
  62. res.status(500).json({ error: 'Server error' });
  63. }
  64. });
  65. module.exports = router;