security.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. const crypto = require('crypto')
  2. const uuid = require('uuid/v4')
  3. const jwt = require('jsonwebtoken')
  4. const SECRET = 'scale action palace measure'
  5. const genSeed = uuid
  6. const hashPassword = ({password, seed, email}) => {
  7. if (!password) throw new Error('Missing password')
  8. if (!seed) throw new Error('Missing seed')
  9. if (!email) throw new Error('Missing email')
  10. email = email.toLowerCase().trim()
  11. password = password.trim()
  12. const hash = crypto.createHash('sha256')
  13. hash.update(`${password},${seed},${email}`)
  14. const result = hash.digest('base64')
  15. return result
  16. }
  17. const createToken = user => jwt.sign(user, SECRET, { expiresIn: '2 days' })
  18. const validate = token => jwt.verify(token, SECRET, { complete: true })
  19. const authorize = (...claims) => (req, res, next) => {
  20. const reg = /^Bearer (.*)$/.exec(req.headers.authorization)
  21. let identity
  22. if (reg && (identity = validate(token))) {
  23. if (claims.every(claim => identity[claim])) {
  24. req.identity = identity
  25. next()
  26. } else {
  27. res.status(403).send('Access denied')
  28. }
  29. } else {
  30. res.status(401).send('Authorization required')
  31. }
  32. }
  33. module.exports = { hashPassword, genSeed, createToken, validate, authorize }