Fla*_*ape 11 javascript cookies session node.js express
我已经使用express和express-session以及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();
}
});
Run Code Online (Sandbox Code Playgroud)
Hunky dory!我可以跳到我的会话表中并从数据库中获取行.这里是:
{"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"}
Run Code Online (Sandbox Code Playgroud)
请注意,您可以看到已设置自定义使用对象.但是,在下一次获取某些数据的请求时,我检查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;
}
Run Code Online (Sandbox Code Playgroud)
但是这记录了一个(显然)空的会话.
user not authorized{"cookie":{"originalMaxAge":600000,"expires":"2015-08-24T23:27:13.455Z","httpOnly":false,"path":"/"}}
Run Code Online (Sandbox Code Playgroud)
进入浏览器,我也看到资源面板中没有设置cookie.这不应该用express 4和session自动生成吗?文档说你不再需要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
Run Code Online (Sandbox Code Playgroud)
在我发现这个之后,我发现它是使用 localhost 而不是在 xhr 请求上设置 useCredentials 的组合。本地主机是什么让我绊倒你必须使用完全限定的 127.0.0.1 并增加头痛,http 文件在不同的端口上提供,因此必须更改通配符以反映这一点。
所以...
//where the server runs on 127.0.0.1:3000 but the http runs from :9000
app.use(session({
name:'some_session',
secret: 'lalala',
resave: true,
saveUninitialized: false,
cookie: { maxAge: 365 * 24 * 60 * 60 * 1000,httpOnly: false , domain:'127.0.0.1:9000'},
store: sessionStore
}));
res.header("Access-Control-Allow-Origin", "http://127.0.0.1:9000");
//important
$http request (angular): useCredentials: true
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7876 次 |
最近记录: |