express -сессия: проверка входа в систему при использовании Socket.IO - PullRequest
0 голосов
/ 10 марта 2020

Я хочу войти на свой сайт и использовать express -сессию, чтобы проверить, вошел ли пользователь в систему или нет. Для запроса данных с сервера я хочу использовать Socketio. Как я могу проверить, вошел ли я в систему, когда использую Socketio? Пример:
1.) Я вхожу в систему
2.) Я буду перенаправлен на защищенную страницу. Отсюда я хочу использовать Socketio
3.) Я очищаю кеш браузера
4.) Я все еще могу использовать Socketio, несмотря на то, что я больше не вошел в систему (потому что я очистил кеш браузера). Как я могу проверить, если я все еще вошел в систему, когда использую Socketio прямо здесь?

Сервер:

var express      = require('express');
var bodyParser   = require('body-parser');
var cookieParser = require('cookie-parser');
var session      = require('express-session');
var bcrypt       = require('bcryptjs');
var cookie       = require('cookie');

require('console-stamp')(console, 'yyyy-mm-dd-HH-MM-ss');

var config = require('./server/config');
var User   = require('./server/models/user');

var app    = express();
var server = require('http').createServer(app);
var sio    = require('socket.io').listen(server);


app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.set('view engine', 'ejs');


app.use(session({
    key: 'user_sid',
    secret: 'somerandonstuffs',
    resave: true,
    saveUninitialized: true,
    cookie: {
        expires: 600000
    }
}));


app.use((req, res, next) => {
    if (req.cookies.user_sid && !req.session.user) {
        res.clearCookie('user_sid');
    }
    next();
});


var sessionChecker = (req, res, next) => {
    if (req.session.user && req.cookies.user_sid) {
        res.redirect('/protected');
    } else {
        next();
    }
};


sio.sockets.on('connection', function(socket) {

  socket.on('channel_1', function(incomingData, cbCh1) {
    //Check here if user is logged in
    cbCh1('test');
  });

});


app.get('/', sessionChecker, (req, res) => {
    res.redirect('/login');
});


app.route('/register')
    .get(sessionChecker, (req, res) => {
        res.render('register');
    })
    .post((req, res) => {
      let hash = bcrypt.hashSync(req.body.password, 14);
      req.body.password = hash;
      let newUser = new User(req.body);
      newUser.save((err) => {
        if (err) {
          let error = "Something went wrong. Please try again.";
          if (err.code === 11000) {
            error = "Email not available.";
          }
          return res.render('register', { error: error });
        }
        res.redirect('login');
      });
    });


app.route('/login')
    .get(sessionChecker, (req, res) => {
        res.render('login');
    })
    .post((req, res) => {
        var email = req.body.email,
            password = req.body.password;

        User.findOne({ email: email }, function(err, dbUserObject) {
            if (!dbUserObject) {
                res.redirect('/login');
            // } else if (!dbUserObject.validPassword(password)) {
            } else if (err || !dbUserObject || !bcrypt.compareSync(req.body.password, dbUserObject.password)) {
                res.redirect('/login');
            } else {
                req.session.user = dbUserObject;
                res.redirect('/protected');
            }
        });
    });


app.get('/protected', (req, res) => {
    if (req.session.user && req.cookies.user_sid) {
        res.render('protected');
    } else {
        res.redirect('/login');
    }
});


app.get('/logout', (req, res) => {
    if (req.session.user && req.cookies.user_sid) {
        res.clearCookie('user_sid');
        res.redirect('/');
    } else {
        res.redirect('/login');
    }
});


app.use(function (req, res, next) {
  res.status(404).send("Sorry not found!")
});


server.listen(config.server.port, function() {
  console.log("----- Server running on port "+server.address().port+" -----");
});

login.e js

<p>Login page</p>
<form action="/login" method="POST">
  Email: <input type="email" name="email" placeholder="Email" required><br>
  Password: <input type="password" name="password" placeholder="Password" required><br>
  <input type="submit" value="Submit">
</form>
<br><br>
<a href="/register">Register</a>

protected.e js

<p>You can only see this if you are logged in!</p>
<a href="/logout">Logout</a>
<br><br>
<button onclick="test1()">Function</button>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io();

function test1() {
  socket.emit('channel_1', { hello: "world" }, function(cbChannel_1) {
    console.log(cbChannel_1);
  });
}
</script>

register.e js

<p>Registration page</p>
<form action="/register" method="POST">
  First Name: <input type="text" name="firstName" placeholder="First Name" required><br>
  Last Name: <input type="text" name="lastName" placeholder="Last Name" required><br>
  Email: <input type="email" name="email" placeholder="Email" required><br>
  Password: <input type="password" name="password" placeholder="Password" required><br>
  <input type="submit" value="Submit">
</form>
...