login.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. const _ = require('lodash')
  2. const config = require('../../../config')
  3. const bcrypt = require('bcryptjs')
  4. const JWT = require('jsonwebtoken')
  5. const aguid = require('aguid')
  6. const { User, Session } = require('../../database')
  7. module.exports = {
  8. post: async (req, res) => {
  9. const user = await User.find({where: {email: req.body.email}})
  10. if (user) {
  11. const success = await bcrypt.compare(req.body.password, user.password)
  12. if (success) {
  13. const permissions = _.chain(await user.getRoles({paranoid: !config.hiddenRoles}))
  14. .map(role => (role.permissions || '').split(','))
  15. .flatten()
  16. .uniq()
  17. .map(permission => [permission, 1])
  18. .fromPairs()
  19. .value()
  20. const sid = aguid()
  21. const exp = Math.floor(Date.now()/1000) + config.auth.jwtExpires
  22. await Session.create({
  23. id: sid,
  24. startAt: Date.now(),
  25. endAt : exp,
  26. })
  27. const token = JWT.sign({
  28. sid,
  29. exp,
  30. ...permissions,
  31. user: user.sanitize()
  32. }, config.auth.jwtSecret);
  33. return res.status(200).send({
  34. user: user.sanitize(),
  35. token
  36. })
  37. }
  38. }
  39. return res.send(401)
  40. }
  41. }