qqLoginStep2.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. const API = require("../../../lib/API")
  2. const { v4: uuidv4 } = require('uuid')
  3. const Redis = require('../../plugin/DataBase/Redis')
  4. const db = require("../../../plugin/DataBase/db")
  5. const { BaseStdResponse } = require("../../../BaseStdResponse");
  6. class qqLoginStep2 extends API {
  7. constructor() {
  8. super()
  9. this.setPath('/User/qqLoginStep2')
  10. this.setMethod('POST')
  11. }
  12. async onRequest(req, res) {
  13. let { qq, code, location, deviceInfo } = req.body
  14. if ([qq, code].some(value => value === '' || value === null || value === undefined))
  15. return res.json({
  16. ...BaseStdResponse.MISSING_PARAMETER
  17. })
  18. if (String(qq).length < 6 || String(qq).length > 10)
  19. return res.json({
  20. ...BaseStdResponse.ERR,
  21. msg: '请输入正确的QQ号'
  22. })
  23. const email = `${qq}@qq.com`
  24. try {
  25. const VerifyCode = await Redis.get(`email:${email}`)
  26. if (!VerifyCode || VerifyCode != code)
  27. return res.json({
  28. ...BaseStdResponse.SMS_CHECK_FAIL,
  29. msg: '验证码输入错误或已过期'
  30. })
  31. } catch (err) {
  32. this.logger.error(`验证验证码失败!${err.stack}`)
  33. return res.json({
  34. ...BaseStdResponse.DATABASE_ERR,
  35. msg: '验证失败!'
  36. })
  37. }
  38. const session = uuidv4()
  39. const time = new Date().getTime()
  40. let selectSql = 'SELECT username, permission, avatar FROM users WHERE email = ?'
  41. let selectRows = await db.query(selectSql, [email])
  42. let uuid, username, permission, avatar
  43. // 用户不存在 执行注册操作
  44. if (selectRows.length == 0) {
  45. uuid = uuidv4()
  46. username = `用户${uuid.slice(0, 8)}`
  47. avatar = `https://q1.qlogo.cn/g?b=qq&nk=${qq}&s=640`
  48. let regSql = 'INSERT INTO users (uuid, username, session, registTime, avatar, email) VALUES (?,?,?,?,?,?) '
  49. let regRows = await db.query(regSql, [uuid, username, session, time, avatar, email])
  50. if (!regRows || regRows.affectedRows !== 1) {
  51. this.logger.error(`用户注册失败!数据库错误`)
  52. return res.json({
  53. ...BaseStdResponse.ERR,
  54. msg: '用户注册失败!'
  55. })
  56. }
  57. }
  58. else {
  59. let updateSql = 'UPDATE users SET session = ?, lastTime = ? WHERE email = ?'
  60. let updateRows = await db.query(updateSql, [session, time, email])
  61. if (!updateRows || updateRows.affectedRows !== 1) {
  62. this.logger.error(`用户登录失败!数据库错误`)
  63. return res.json({
  64. ...BaseStdResponse.ERR,
  65. msg: '用户登录失败!请稍后再试'
  66. })
  67. }
  68. avatar = selectRows[0].avatar
  69. username = selectRows[0].username
  70. permission = selectRows[0].permission
  71. }
  72. res.json({
  73. ...BaseStdResponse.OK,
  74. data: {
  75. uuid,
  76. username,
  77. session,
  78. roles: permission || [],
  79. avatar
  80. }
  81. })
  82. // 增加登录记录
  83. try {
  84. const ip = req.headers['x-forwarded-for']?.split(',')[0].trim() || req.connection.remoteAddress
  85. let insertSql = 'INSERT INTO login_history (uuid, time, location, deviceInfo, type, ip)'
  86. await db.query(insertSql, [uuid, time, location, deviceInfo, 'qq', ip])
  87. } catch (error) {
  88. this.logger.error(`写入登录记录失败!${error}`)
  89. }
  90. }
  91. }
  92. module.exports.qqLoginStep2 = qqLoginStep2