const express = require('express'); const router = express.Router(); const crypto = require('crypto'); const events = require('events'); const db = require('../common/mysqlConnection'); router.post('/', (req, res, next) => { if (req.session.signinStatus) { res.send({ status: 'signedin', info: '已登录', url: '#/index' }); } else { if (!req.body) { res.send({ status: 'error', info: '参数错误,请重试' }); } else { let captchaCode = req.body.captcha; if (req.session.captcha !== captchaCode) { res.status(200).send({ status: 'error', info: '验证码错误' }); } else { let emitter = new events.EventEmitter(), userId = req.body.userId, password = req.body.password; emitter.on('ok', () => { //更改登录状态 req.session.signinId = userId; req.session.signinStatus = true; res.send({ status: 'signedin', info: '登陆成功', url: '#/index' }); }); emitter.on('err', (err, errInfo) => { res.json({ status: 'error', info: errInfo, error: err }); }); //从User表中取对应ID的密码和盐值 emitter.on('selectUserPasswordAndSaltFromUserTable', () => { //定义SQL语句查询 let pool = db.pool.adminDatabasePool; sqlString = 'SELECT password, salt FROM CloudSqlAdmin_Users WHERE userId = ?', value = [userId]; db.queryArgs(pool, sqlString, value, (err, results, fields) => { if (err) { emitter.emit('err', err.err, '数据库查询出错'); } else { let passwordHashOnDb = results[0].password, salt = results[0].salt; emitter.emit('checkUserPassword', passwordHashOnDb, salt); } }); }) //检测用户密码是否正确 emitter.on('checkUserPassword', (passwordHashOnDb, salt) => { crypto.pbkdf2(password, salt, 4096, 256, 'SHA256', (err, hash) => { if (err) { emitter.emit('err', err, '后端逻辑出错,请联系管理员修复该问题'); throw err; } hash = hash.toString('hex'); //生成密文 if (hash != passwordHashOnDb) { emitter.emit('err', null, '用户名/邮箱或密码错误,请重试。'); } else { emitter.emit('ok') } }) }); emitter.emit('selectUserPasswordAndSaltFromUserTable'); } } } }); module.exports = router