qqLoginStep2.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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 uuid, 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. uuid = selectRows[0].uuid
  69. avatar = selectRows[0].avatar
  70. username = selectRows[0].username
  71. permission = selectRows[0].permission
  72. }
  73. res.json({
  74. ...BaseStdResponse.OK,
  75. data: {
  76. uuid,
  77. username,
  78. session,
  79. roles: permission || [],
  80. avatar
  81. }
  82. })
  83. await Redis.del(`email:${email}`)
  84. // 增加登录记录
  85. try {
  86. let ip = req.headers['x-forwarded-for']?.split(',')[0].trim() || req.connection.remoteAddress
  87. if (ip.startsWith('::ffff:')) {
  88. ip = ip.replace('::ffff:', '');
  89. }
  90. let insertSql = 'INSERT INTO login_history (uuid, time, location, deviceInfo, type, ip) VALUES (?, ?, ?, ?, ?, ?)'
  91. await db.query(insertSql, [uuid, time, location, deviceInfo, 'qq', ip])
  92. } catch (error) {
  93. this.logger.error(`写入登录记录失败!${error}`)
  94. }
  95. }
  96. }
  97. module.exports.qqLoginStep2 = qqLoginStep2