user.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. const express = require('express');
  2. const bcrypt = require('bcryptjs');
  3. const jwt = require('jsonwebtoken');
  4. const router = express.Router();
  5. const authMiddleware = require('../middleware/authMiddleware');
  6. const User = require('../models/User');
  7. // 注册
  8. router.post('/register', async (req, res) => {
  9. const { username, password } = req.body;
  10. try {
  11. const existing = await User.findOne({ username });
  12. if (existing) {
  13. return res.badRequest('用户已存在');
  14. }
  15. const hashedPassword = await bcrypt.hash(password, 10);
  16. const user = new User({ username, password: hashedPassword });
  17. await user.save();
  18. res.sendSuccess('注册成功');
  19. }
  20. catch (err) {
  21. res.serverError();
  22. }
  23. });
  24. // 登录
  25. router.post('/login', async (req, res) => {
  26. const { username, password } = req.body;
  27. try {
  28. const user = await User.findOne({ username });
  29. if (!user) {
  30. return res.badRequest('用户不存在');
  31. }
  32. const isMatch = await bcrypt.compare(password, user.password);
  33. if (!isMatch) {
  34. return res.badRequest('密码错误');
  35. }
  36. // 签发 Access Token 和 Refresh Token
  37. const accessToken = jwt.sign({ userId: user._id }, process.env.JWT_SECRET, { expiresIn: '1h' });
  38. const refreshToken = jwt.sign({ userId: user._id }, process.env.JWT_SECRET, { expiresIn: '7d' });
  39. res.json({ access_token: accessToken, refresh_token: refreshToken });
  40. }
  41. catch (err) {
  42. res.serverError();
  43. }
  44. });
  45. // 刷新 Token
  46. router.post('/refresh_token', async (req, res) => {
  47. const { refreshToken } = req.body;
  48. if (!refreshToken) {
  49. return res.unauthorized('无效的 "refresh token"');
  50. }
  51. try {
  52. // 验证 Refresh Token
  53. const decoded = jwt.verify(refreshToken, process.env.JWT_SECRET);
  54. const user = await User.findById(decoded.userId);
  55. if (!user) {
  56. return res.unauthorized('用户不存在');
  57. }
  58. // 签发新的 Access Token
  59. const newAccessToken = jwt.sign({ userId: user._id }, process.env.JWT_SECRET, { expiresIn: '1h' });
  60. res.json({ access_token: newAccessToken });
  61. }
  62. catch (err) {
  63. res.unauthorized('无效或已过期的 "refresh token"');
  64. }
  65. });
  66. // 受保护接口
  67. // router.get('/profile', authMiddleware, async (req, res) => {
  68. // const user = await User.findById(req.userId).select('-password');
  69. // res.json(user);
  70. // });
  71. module.exports = router;