signin.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. const express = require('express');
  2. const router = express.Router();
  3. const crypto = require('crypto');
  4. const events = require('events');
  5. const db = require('../common/mysqlConnection');
  6. router.post('/', (req, res, next) => {
  7. if (req.session.signinStatus) {
  8. res.send({
  9. status: 'signedin',
  10. info: '已登录',
  11. url: '#/index'
  12. });
  13. } else {
  14. if (!req.body) {
  15. res.send({
  16. status: 'error',
  17. info: '参数错误,请重试'
  18. });
  19. } else {
  20. let captchaCode = req.body.captcha;
  21. if (req.session.captcha !== captchaCode) {
  22. res.status(200).send({
  23. status: 'error',
  24. info: '验证码错误'
  25. });
  26. } else {
  27. let emitter = new events.EventEmitter(),
  28. userId = req.body.userId,
  29. password = req.body.password;
  30. emitter.on('ok', () => {
  31. //更改登录状态
  32. req.session.signinId = userId;
  33. req.session.signinStatus = true;
  34. res.send({
  35. status: 'signedin',
  36. info: '登陆成功',
  37. url: '#/index'
  38. });
  39. });
  40. emitter.on('err', (err, errInfo) => {
  41. res.json({
  42. status: 'error',
  43. info: errInfo,
  44. error: err
  45. });
  46. });
  47. //从User表中取对应ID的密码和盐值
  48. emitter.on('selectUserPasswordAndSaltFromUserTable', () => {
  49. //定义SQL语句查询
  50. let pool = db.pool.adminDatabasePool;
  51. sqlString = 'SELECT password, salt FROM CloudSqlAdmin_Users WHERE userId = ?',
  52. value = [userId];
  53. db.queryArgs(pool, sqlString, value, (err, results, fields) => {
  54. if (err) {
  55. emitter.emit('err', err.err, '数据库查询出错');
  56. } else {
  57. let passwordHashOnDb = results[0].password,
  58. salt = results[0].salt;
  59. emitter.emit('checkUserPassword', passwordHashOnDb, salt);
  60. }
  61. });
  62. })
  63. //检测用户密码是否正确
  64. emitter.on('checkUserPassword', (passwordHashOnDb, salt) => {
  65. crypto.pbkdf2(password, salt, 4096, 256, 'SHA256', (err, hash) => {
  66. if (err) {
  67. emitter.emit('err', err, '后端逻辑出错,请联系管理员修复该问题');
  68. throw err;
  69. }
  70. hash = hash.toString('hex'); //生成密文
  71. if (hash != passwordHashOnDb) {
  72. emitter.emit('err', null, '用户名/邮箱或密码错误,请重试。');
  73. } else {
  74. emitter.emit('ok')
  75. }
  76. })
  77. });
  78. emitter.emit('selectUserPasswordAndSaltFromUserTable');
  79. }
  80. }
  81. }
  82. });
  83. module.exports = router