Я получил довольно далеко от экспресс-и экспресс-сессии и express-sql-session. У меня есть создание строки в базе данных для сеанса, когда пользователь входит в систему. Вот как я его установил:
//login route handler
this.bcrypt.compare(password, row.hashed, function(err, passwordsMatch) {
if (passwordsMatch === true) {
console.log("user now logged in");
req.session.user = row;
req.session.success = 'User successfully logged in';
res.send(row);
res.end();
}
});
Хунки Дори! Я могу прыгнуть в свою таблицу сеансов и получить строку из базы данных. Вот он:
{"cookie":{"originalMaxAge":600000,"expires":"2015-08-24T23:16:20.079Z","httpOnly":false,"path":"/"},
"user":{"userID":24,"userName":"g","email":"g","joinDate":"2015-08-24T07:15:33.000Z"},"success":"User successfully logged in"}
Обратите внимание, что вы можете увидеть, что пользовательский объект использования установлен. Однако при следующем запросе на получение некоторых данных я проверяю объект user
в сеансе:
// some other route called after login.
if (!req.session.user) {
console.log('user not authorized' + JSON.stringify(req.session));
res.send('not authorized');
return;
}
но записывает (по-видимому) пустую сессию.
user not authorized{"cookie":{"originalMaxAge":600000,"expires":"2015-08-24T23:27:13.455Z","httpOnly":false,"path":"/"}}
Перейдя в браузер, я также вижу, что на панели ресурсов не установлен файл cookie. Разве это не должно автоматически генерироваться с помощью выражения 4 и сеанса? Документы говорят, что вам больше не нужен expressCookie() с express 4. Как получить правильный сеанс для последующих запросов?
Кроме того, если я снова вхожу в систему, он просто создает повторяющуюся строку в таблице сеансов. Как правильно настроить cookie в ответе, чтобы сделать эту работу для следующего запроса?
Здесь моя конфигурация сеанса, если это помогает:
// at the beginning of my node server
import express = require('express');
import bodyParser = require('body-parser');
import Q = require('q');
import mysql = require('mysql');
var app = express();
import bcrypt = require('bcrypt');
import userModule = require('./userModule')
var UserRepository = new userModule.UserNamespace.UserRepository(connectToMySQL, bcrypt, Q );
import session = require('express-session');
var SessionStore = require('express-sql-session')(session);
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Credentials', 'true');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
var storeOptions = {
client: 'mysql',
connection: {
host:SQLHOST,
port:SQLPORT,
user:SQLUSER,
password: SQLPASS,
database: SQLDB
},
table: SESSION_TABLE,
expires: 365 * 24 * 60 * 60 * 1000
};
var sessionStore = new SessionStore( storeOptions );
app.use(session({
secret: 'meeogog',
resave: false,
saveUninitialized: false,
cookie: { maxAge: 600000,httpOnly: false },
store: sessionStore
}));
...
app.post('/users/login/', function (req, res) {
UserRepository.loginHashed(req, res);
});
..and then more routes, and so forth