server.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. const app = require('./app')
  2. const db = require('./db')
  3. const log = require('./log')
  4. const { hashPassword, genSeed, authorize, createToken } = require('./security')
  5. app.post('/signup', async (req, res) => {
  6. if (!req.body.name) throw new Error('Missing name')
  7. if (!req.body.password) throw new Error('Missing password')
  8. if (!req.body.email) throw new Error('Missing email')
  9. const email = req.body.email.toLowerCase().trim()
  10. const existing = await db.users.get(email)
  11. if (existing) throw new Error('User already exists.')
  12. const seed = genSeed()
  13. const password = hashPassword({password: req.body.password, email, seed})
  14. const user = {
  15. name: req.body.name,
  16. email: req.body.email,
  17. password,
  18. seed,
  19. ip: req.ip,
  20. created: Date.now()
  21. }
  22. await db.users.put(email, user)
  23. log({
  24. type: 'user-created',
  25. user
  26. })
  27. res.status(200).send({
  28. token: createToken(user)
  29. })
  30. })
  31. app.post('/login', async (req, res) => {
  32. if (!req.body.password) throw new Error('Missing password')
  33. if (!req.body.email) throw new Error('Missing email')
  34. const email = req.body.email.toLowerCase().trim()
  35. const user = await db.users.get(email)
  36. if (user) {
  37. const password = hashPassword({
  38. password: req.body.password,
  39. seed: user.seed,
  40. email
  41. })
  42. if (password === user.password) {
  43. log({ type: 'login', user})
  44. res.status(200).send({
  45. token: createToken(user)
  46. })
  47. return
  48. }
  49. }
  50. res.status(400).send({
  51. error: 'Login failed'
  52. })
  53. })
  54. app.post('/renew', authorize(), async (req, res) => {
  55. log({
  56. type: 'renew',
  57. user: req.identity
  58. })
  59. const identity = {...req.identity}
  60. delete identity.eat
  61. delete identity.iat
  62. res.status(200).send({
  63. token: createToken(identity)
  64. })
  65. })
  66. app.start()