Я хочу войти на свой сайт и использовать 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>