Login.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. const { v4: uuidv4 } = require('uuid')
  2. const API = require("../../lib/API")
  3. const bcryptjs = require('bcryptjs')
  4. const { BaseStdResponse } = require("../../BaseStdResponse")
  5. const db = require("../../plugin/DataBase/db")
  6. const Redis = require('../../plugin/DataBase/Redis')
  7. // 用户登录
  8. class Login extends API {
  9. constructor() {
  10. super();
  11. this.setMethod("POST");
  12. this.setPath("/User/Login");
  13. }
  14. async onRequest(req, res) {
  15. let { username, password, captcha, id } = req.body;
  16. if ([username, password, captcha, id].some(value => value === '' || value === null || value === undefined)) {
  17. res.json({
  18. ...BaseStdResponse.MISSING_PARAMETER
  19. });
  20. return;
  21. }
  22. password = atob(password);
  23. try {
  24. const code = await Redis.get(`captcha:${id}`);
  25. if (!code || code != captcha.toLowerCase())
  26. return res.json({
  27. ...BaseStdResponse.ERR,
  28. msg: '验证码错误或已过期!'
  29. })
  30. Redis.del(`captcha:${id}`);
  31. } catch (err) {
  32. this.logger.error(`验证图片验证码失败!${err.stack}`);
  33. return res.json({
  34. ...BaseStdResponse.DATABASE_ERR,
  35. msg: '验证失败!'
  36. })
  37. }
  38. let sql = 'SELECT * FROM users WHERE username = ?';
  39. let rows = await db.query(sql, [username]);
  40. if (!rows || rows.length !== 1 || !rows[0].password|| !bcryptjs.compareSync(password, rows[0].password))
  41. return res.json({
  42. ...BaseStdResponse.ERR,
  43. msg: '用户名或密码错误'
  44. })
  45. if (Number(rows[0].is_banned) === 1)
  46. return res.json({
  47. ...BaseStdResponse.ERR,
  48. msg: '账号已被封禁,如有疑问请邮件联系:service@xxoo365.top'
  49. })
  50. const session = uuidv4()
  51. await Redis.set(`userSession:${rows[0].uuid}`, session, {
  52. EX: 2592000
  53. })
  54. res.json({
  55. ...BaseStdResponse.OK,
  56. data: {
  57. uuid: rows[0].uuid,
  58. username: rows[0].username,
  59. session,
  60. roles: rows[0].permission || [],
  61. vip: rows[0].vip,
  62. ic_count: rows[0].ic_count,
  63. lepao_count: rows[0].lepao_count,
  64. crouse_count: rows[0].crouse_count,
  65. avatar: rows[0].avatar,
  66. email: rows[0].email
  67. }
  68. })
  69. const time = new Date().getTime()
  70. sql = 'UPDATE users SET lastTime = ? WHERE id = ?';
  71. await db.query(sql, [time, rows[0].id]);
  72. try {
  73. let ip = req.headers['x-forwarded-for']?.split(',')[0].trim() || req.connection?.remoteAddress || ''
  74. if (ip.startsWith('::ffff:'))
  75. ip = ip.replace('::ffff:', '')
  76. const userAgent = req.headers['user-agent']
  77. await db.query(
  78. 'INSERT INTO login_history (uuid, time, deviceInfo, type, ip) VALUES (?, ?, ?, ?, ?)',
  79. [rows[0].uuid, time, { ua: userAgent }, 'password', ip]
  80. )
  81. } catch (err) {
  82. this.logger.error(`写入登录记录失败!${err}`)
  83. }
  84. }
  85. }
  86. module.exports.Login = Login;