javascript - 关于快速 session 和 cookie,我缺少什么?

标签 javascript node.js session cookies express

我已经在 express 和 express-session 和 express-sql-session 方面取得了相当大的进展。当用户登录时,我已经在数据库中为 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();
    }
});

多莉!我可以跳入我的 session 表并从数据库中获取行。这里是:

{"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"}

请注意,您可以看到自定义使用对象已设置。但是,在下一个获取数据的请求中,我会检查 session 中的 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;
}

但这会记录一个(显然)空 session 。

user not authorized{"cookie":{"originalMaxAge":600000,"expires":"2015-08-24T23:27:13.455Z","httpOnly":false,"path":"/"}}

进入浏览器,我还看到资源面板中没有设置 cookie。这不应该用 express 4 和 session 自动生成吗?文档说您不再需要 expressCookie() 和 express 4。如何在后续请求中获得正确的 session ?

另外,如果我再次登录,它只会在 session 表中创建一个重复的行。 如何在响应中正确设置 cookie 以使其适用于下一个请求?

如果有帮助,这是我的 session 配置:

// 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

最佳答案

就在我获得这个奖励之后,我发现它是使用 localhost 而不是在 xhr 请求上设置 useCredentials 的组合。本地主机让我感到困惑,您必须使用完全限定的 127.0.0.1,更令人头疼的是,http 文件在不同的端口上提供服务,因此必须更改通配符以反射(reflect)这一点。

所以...

//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

关于javascript - 关于快速 session 和 cookie,我缺少什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32193283/

相关文章:

PHP 对象保存

javascript - 等待按钮点击后再继续

node.js - 变量在分配之前使用

javascript - Mongoose 中未处理的PromiseRejection警告

javascript - 如何通过 sudo 命令使用 forever-node?

session - Openshift 如何在自动缩放应用程序中默认处理 session ?

c# - 如何获取名称以特定字符串开头的所有 session 变量?

javascript - 如何使用 jQuery 将查询字符串传递给 Ajax 调用?

javascript - 来自两个不同帐户的双谷歌分析代码?

javascript - 警报 ('hello' );在 pageLoad() 函数中工作?