2016-05-10 2 views
2

Я работаю на простой системе авторизации, но кажется, что сессия не сохраняетсяNodeJS экспресс-сессия req.session неопределен

я сделал простой код для тестирования, может кто-нибудь сказать мне, что случилось с этим ? я бегу логин и после того, что я бегу is_logged, но я никогда не буду регистрироваться и оба сеанса не определены

var port = process.env.PORT || 8080; 
var express = require('express'); 
var app = express(); 


var cookieParser = require('cookie-parser'); 
var session = require('express-session'); 



app.use(cookieParser()); 
app.use(session({ 
    secret: "[email protected][email protected]#$D&W", 
    resave: false, 
    saveUninitialized: true, 
    cookie: { secure: true } 
})); 



app.post('/test_login', function(req, res){ 

    req.session.users_schema = 1; 
    req.session.user_doc = 2; 

    res.json({"first": req.session.users_schema, "second": req.session.user_doc}); 
}); 
app.post('/test_is_loggin', function(req, res){ 

    if(!req.session.users_schema || !req.session.user_doc) { 

     console.log("no"); 
     res.json({"first": 1, "second": 1}); 
    } 
    else { 

     console.log("no2"); 
     res.json({"first": req.session.users_schema, "second": req.session.user_doc}); 
    } 

}); 


app.listen(port); 
console.log('Listening on port ' + port); 

ответ

4

Это из-за опции cookie.secure = true

цитата

Обратите внимание что secure: true - рекомендуемый вариант. Однако для этого необходим веб-сайт с поддержкой https, то есть HTTPS необходим для безопасного куки-файлов .

см https://github.com/expressjs/session#cookie-options

Вы должны установить его на ложь, чтобы куки сессии на не-HTTPS хоста, или использовать HTTPS хост.

тестовый код

var port = process.env.PORT || 8080; 
var express = require('express'); 
var app = express(); 


var cookieParser = require('cookie-parser'); 
var session = require('express-session'); 



app.use(cookieParser()); 
app.use(session({ 
    secret: "[email protected][email protected]#$D&W", 
    resave: false, 
    saveUninitialized: true, 
    cookie: { secure: !true } 
})); 



app.get('/test_login', function(req, res){ 

    req.session.users_schema = 1; 
    req.session.user_doc = 2; 

    res.json({"first": req.session.users_schema, "second": req.session.user_doc}); 
}); 
app.get('/test_is_loggin', function(req, res){ 

    if(!req.session.users_schema || !req.session.user_doc) { 

     console.log("no"); 
     res.json({"first": 1, "second": 1}); 
    } 
    else { 

     console.log("OK"); 
     res.json({"first": req.session.users_schema, "second": req.session.user_doc}); 
    } 

}); 


app.listen(port); 
console.log('Listening on port ' + port); 

выход

[[email protected] test] $ node express-session.js 
Listening on port 8080 
OK 
+0

Спасибо за быстрый ответ, я установил его в false, но все еще не работает:/ – xsss

+0

ye а? Я добавил свой тестовый код. –

+0

копию вставили и добавил: app.use (функция (Req, Рез, следующий) { res.header ("Access-Control-Allow-Origin", "*"); res.header ("Access- Control-Allow-Headers "," Origin, X-Requested-With, Content-Type, Accept "); next(); }); но все еще не работает, я все еще зарегистрирован даже после использования логина:/ – xsss

0

я не уверен, но это может быть связано с тем, как я посылаю данные?

<script> 

var date = new Date("05/05/2016"); 


$.ajax({ 

    type : "POST", 
    url : '//localhost:8080/test_login', 
    data : { 

    }, 
    success : function(data) { 

     console.log(data); 
    }, 
    error : function(req, errortype) { 
     console.log("ERROR"); 
    } 

}); 

</script> 

==========================================

РЕШЕННЫЙ !!!

это было связано с тем, как я посылаю мои данные, я изменил его на следующее:

КЛИЕНТ:

$.ajax({ 

    type : "POST", 
    xhrFields: {withCredentials: true}, // ADDED THIS LINE 
    url : '//localhost:8080/test_login', 
    data : { 

    }, 
    success : function(data) { 

     console.log(data); 
    }, 
    error : function(req, errortype) { 
     console.log("ERROR"); 
    } 

}); 

SERVER:

app.use(function(req, res, next) { 

    res.header('Access-Control-Allow-Credentials', true); 
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
    res.header("Access-Control-Allow-Origin", "http://localhost"); 
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
    next(); 
}); 

Спасибо так много @ mh-cbon

Смежные вопросы