routes.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import express from 'express';
  2. const router = express.Router();
  3. // POST /api/auth/login — 支持 email/phone/name 登录
  4. router.post('/login', async (req, res) => {
  5. try {
  6. const Parse = (globalThis as any).Parse;
  7. const { identifier, password } = req.body;
  8. if (!identifier || !password) {
  9. return res.status(400).json({ success: false, error: '缺少 identifier 或 password' });
  10. }
  11. // 1. 先尝试直接用 identifier 作为 username 登录
  12. try {
  13. const user = await Parse.User.logIn(identifier, password);
  14. return res.json({
  15. success: true,
  16. data: {
  17. objectId: user.id,
  18. username: user.get('username'),
  19. email: user.get('email'),
  20. name: user.get('name'),
  21. role: user.get('role'),
  22. department: user.get('department'),
  23. phone: user.get('phone'),
  24. sessionToken: user.getSessionToken(),
  25. },
  26. });
  27. } catch { /* 继续尝试其他方式 */ }
  28. // 2. 通过 email 查找
  29. const q1 = new Parse.Query(Parse.User);
  30. q1.equalTo('email', identifier);
  31. let user = await q1.first({ useMasterKey: true });
  32. // 3. 通过 phone 查找
  33. if (!user) {
  34. const q2 = new Parse.Query(Parse.User);
  35. q2.equalTo('phone', identifier);
  36. user = await q2.first({ useMasterKey: true });
  37. }
  38. // 4. 通过 name 查找
  39. if (!user) {
  40. const q3 = new Parse.Query(Parse.User);
  41. q3.equalTo('name', identifier);
  42. user = await q3.first({ useMasterKey: true });
  43. }
  44. if (!user) {
  45. return res.status(401).json({ success: false, error: '账户不存在' });
  46. }
  47. // 用找到的 username 尝试登录
  48. try {
  49. const loggedIn = await Parse.User.logIn(user.get('username'), password);
  50. return res.json({
  51. success: true,
  52. data: {
  53. objectId: loggedIn.id,
  54. username: loggedIn.get('username'),
  55. email: loggedIn.get('email'),
  56. name: loggedIn.get('name'),
  57. role: loggedIn.get('role'),
  58. department: loggedIn.get('department'),
  59. phone: loggedIn.get('phone'),
  60. sessionToken: loggedIn.getSessionToken(),
  61. },
  62. });
  63. } catch {
  64. return res.status(401).json({ success: false, error: '密码错误或账户已停用' });
  65. }
  66. } catch (e: any) {
  67. res.status(500).json({ success: false, error: e.message });
  68. }
  69. });
  70. // GET /api/auth/me — 获取当前用户
  71. router.get('/me', async (req, res) => {
  72. try {
  73. const token = req.headers.authorization?.replace('Bearer ', '') || '';
  74. if (!token) {
  75. return res.status(401).json({ success: false, error: '未登录' });
  76. }
  77. const Parse = (globalThis as any).Parse;
  78. const q = new Parse.Query('_Session');
  79. q.equalTo('sessionToken', token);
  80. const session = await q.first({ useMasterKey: true });
  81. if (!session) {
  82. return res.status(401).json({ success: false, error: 'token 已失效' });
  83. }
  84. const user = session.get('user');
  85. if (user) {
  86. await user.fetch({ useMasterKey: true });
  87. res.json({
  88. success: true,
  89. data: {
  90. objectId: user.id,
  91. username: user.get('username'),
  92. email: user.get('email'),
  93. name: user.get('name'),
  94. role: user.get('role'),
  95. department: user.get('department'),
  96. phone: user.get('phone'),
  97. },
  98. });
  99. } else {
  100. res.status(401).json({ success: false, error: '用户不存在' });
  101. }
  102. } catch (e: any) {
  103. res.status(500).json({ success: false, error: e.message });
  104. }
  105. });
  106. export default router;