sessions.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. "use strict";
  2. var config = require('config');
  3. const db = require('../../models/db');
  4. var bcrypt = require('bcryptjs');
  5. var crypto = require('crypto');
  6. var URL = require('url').URL;
  7. var express = require('express');
  8. var router = express.Router();
  9. router.post('/', function(req, res) {
  10. var data = req.body;
  11. if (!data.email || !data.password) {
  12. res.status(400).json({});
  13. return;
  14. }
  15. var email = req.body.email.toLowerCase();
  16. var password = req.body["password"];
  17. db.User.findOne({where: {email: email}})
  18. .error(err => {
  19. res.sendStatus(404);
  20. })
  21. .then(user => {
  22. if (!user) {
  23. res.sendStatus(404);
  24. }
  25. else if (bcrypt.compareSync(password, user.password_hash)) {
  26. crypto.randomBytes(48, function(ex, buf) {
  27. var token = buf.toString('hex');
  28. var session = {
  29. user_id: user._id,
  30. token: token,
  31. ip: req.ip,
  32. device: "web",
  33. created_at: new Date()
  34. };
  35. db.Session.create(session)
  36. .error(err => {
  37. console.error("Error creating Session:",err);
  38. res.sendStatus(500);
  39. })
  40. .then(() => {
  41. var domain = (process.env.NODE_ENV == "production") ? new URL(config.get('endpoint')).hostname : req.headers.hostname;
  42. res.cookie('sdsession', token, { domain: domain, httpOnly: true });
  43. res.status(201).json(session);
  44. });
  45. });
  46. } else {
  47. res.sendStatus(403);
  48. }
  49. });
  50. });
  51. router.delete('/current', function(req, res, next) {
  52. if (req.user) {
  53. var token = req.cookies['sdsession'];
  54. db.Session.findOne({where: {token: token}})
  55. .then(session => {
  56. session.destroy();
  57. });
  58. var domain = (process.env.NODE_ENV == "production") ? new URL(config.get('endpoint')).hostname : req.headers.hostname;
  59. res.clearCookie('sdsession', { domain: domain });
  60. res.sendStatus(204);
  61. } else {
  62. res.sendStatus(404);
  63. }
  64. });
  65. module.exports = router;