Advertisement
Guest User

Untitled

a guest
Apr 29th, 2017
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // load dependencies
  2. import express from 'express';
  3. import bodyParser from 'body-parser';
  4. import multer from 'multer';
  5. import cookieParser from 'cookie-parser';
  6. import expressSession from 'express-session';
  7. import Sequelize from 'sequelize';
  8. let Store = require('express-sequelize-session')(expressSession.Store);
  9.  
  10. // use in-memory SQLite3 database
  11. let sequelize = new Sequelize('itest', 'sa', 'secret', {dialect: 'sqlite', logging: false});
  12. let store = new Store(sequelize);
  13.  
  14. // define user table
  15. let User = sequelize.define('user', {
  16.   login: {
  17.     type: Sequelize.STRING,
  18.     allowNull: false,
  19.     unique: true
  20.   },
  21.   password: {
  22.     type: Sequelize.STRING,
  23.     allowNull: false
  24.   }
  25. }
  26. );
  27.  
  28. // associate session user
  29. User.belongsTo(store.Session, {foreignKeyConstraint: true});
  30.  
  31. // process a login request, reference the session and yield the user
  32. let login = (req, done) =>
  33.   User.findOne({
  34.     where: {
  35.       login: req.body.login,
  36.       password: req.body.password
  37.     }}).then(function(user) {
  38.     if (!user) {
  39.       throw new Error('login failed');
  40.     } else {
  41.       return store.Session.findOne({
  42.         where: {
  43.           sid: req.sessionID
  44.         }}).then(function(session) {
  45.         if (!session) { // login without session
  46.           return user;
  47.         } else { // reference session
  48.           return user.setSession(session);
  49.         }
  50.       });
  51.     }}).then(user => done(null, user)).catch(err => done(err, null))
  52. ;
  53.  
  54. // process a logout request
  55. let logout = (req, done) =>
  56.   User.findOne({
  57.     where: {
  58.       login: req.session.user
  59.     }}).then(function(user) {
  60.     if (!user) {
  61.       throw new Error('logout failed');
  62.     } else {
  63.       return user.setSession(null);
  64.     }}).then(user => done(null, user)).catch(err => done(err, null))
  65. ;
  66.  
  67. // create and configure express app
  68. let app = express();
  69. app.use(bodyParser.json()); // for parsing application/json
  70. app.use(bodyParser.urlencoded({extended: true})); // for parsing application/x-www-form-urlencoded
  71. app.use(multer()); // for parsing multipart/form-data
  72. app.use(cookieParser());
  73. app.use(expressSession({
  74.   name: 'sid',
  75.   secret: 'MyAwesomeAppSessionSecret',
  76.   store,
  77.   resave: false,
  78.   saveUninitialized: true
  79. })
  80. );
  81.  
  82. // restrict all requests
  83. app.all('*', function(req, res, next) {
  84.   if (['/', '/login', '/logout'].includes(req.path)) {
  85.     return next(); // always allow access of these resources
  86.   } else { // check user session
  87.     if (req.session.user) {
  88.       return next(); // authenticated request
  89.     } else {
  90.       return res.sendStatus(401);
  91.     }
  92.   }
  93. }); // unauthorized
  94.  
  95. // public index page with login form
  96. app.get('/', (req, res) =>
  97.   res.send(`\
  98. <html><head><title>restricted area</title></head><body>
  99. <form action="/login" method="POST">
  100.   <label>Login <input type="text" name="login"/></label>
  101.   <label>Password <input type="password" name="password"/></label>
  102.   <button type="submit">Login</button>
  103. </form></body></html>\
  104. `
  105.   )
  106. );
  107.  
  108. // validate login and redirect
  109. app.post('/login', (req, res, next) =>
  110.   login(req, function(err, user) {
  111.     if (err != null) { return next(err); } else { // re-ref user login
  112.       req.session.user = user.login;
  113.       return res.redirect('/private');
  114.     }
  115.   })
  116. );
  117.  
  118. // logout and redirect
  119. app.get('/logout', (req, res, next) =>
  120.   logout(req, function(err) {
  121.     if (err != null) { return next(err); } else {
  122.       delete req.session.user; // de-ref user for safety
  123.       return req.session.destroy(() => res.redirect('/'));
  124.     }
  125.   })
  126. );
  127.  
  128. // private content page
  129. app.get('/private', (req, res) =>
  130.   res.send(`\
  131. <html><head><title>private space</title></head><body>
  132. <h1>Welcome ${req.session.user}</h1>
  133. <p>nice 2 cu</p>
  134. <a href="/logout">Logout</a>
  135. </body></html>\
  136. `
  137.   )
  138. );
  139.  
  140. // export database and express app
  141. export default function(done) {
  142.   return sequelize.sync({
  143.     force: true})
  144.   .then(() =>
  145.     done(null, app, {
  146.       Session: store.Session,
  147.       User
  148.     }
  149.     )).catch(err => done(err));
  150. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement