Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
160
rated 0 times [  161] [ 1]  / answers: 1 / hits: 17291  / 11 Years ago, mon, january 13, 2014, 12:00:00

I am using Express and node for the session management with https. I want to create a session using express so that authentication and the session is made before the redirection to the static files in the public folder. Previously i was having a problem Trouble using express.session with https
But it was solved by including path in the express.session as /public but now my req.session is showing as undefined but in the browser there is connect.sid cookie present



The app.js is :



var express = require('express')TypeError: Cannot set property 'user_id' of undefined at /opt/expressjs/app.js:59:24 at callbacks;
var http = require('http');
var https = require('https');
var fs = require('fs');
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('localhost:27017/svgtest1');
var options = {
key: fs.readFileSync('privatekey.pem'),
cert: fs.readFileSync('certificate.pem')
};

var app = express();

app.use(express.static(__dirname + '/public'));
app.use(express.urlencoded());
app.use(express.json());
app.use(express.cookieParser());
app.use(express.session({cookie: { path: '/public/',httpOnly: false , maxAge: 24*60*60*1000}, secret: '1234567890QWERT'}));

//middle ware to check auth
function checkAuth(req, res, next) {
if (!req.session.user_id) {
res.send('You are not authorized to view this page');
} else {
next();
}
}


app.get('/', function(req, res) {
console.log('First page called');
res.redirect('loginform.html');
console.log('redirected');
res.end();
});

app.post('/login', function(req, res) {
console.log('login called');
var usrfield = req.body.usrfield;
var passfield = req.body.passfield;

console.log(req.session);


// Play with the username and password

if (usrfield == 'kk' && passfield == '123') {
req.session.user_id = 'xyz';
res.redirect('svg-edit.html');
} else {
res.send('Bad user/pass');
}


console.log(usrfield);
console.log(passfield);
res.end();
});


Client Side :



<html>

<style media=screen type=text/css>
@import url(css/loginform_styles.css);
</style>

<head>
<script type=text/javascript src=annotationTools/js/md5.js ></script>
<script>

function validateForm()
{
var usrnamefield=document.forms[loginform][usrfield].value;
var passwrdfield=document.forms[loginform][passfield].value;

if ((usrnamefield==null || usrnamefield==)||(passwrdfield==null || passwrdfield==))
{
document.getElementById('valueerrorlayer').innerHTML ='Username or password field is empty';
//document.forms[loginform][errorshow].innerHtml = 'username or password empty';
return false;
}
else return true;
}
</script>

</head>

<body>


<form name=loginform id=loginform action=https://localhost:8888/login method=post onsubmit=return validateForm()>
<div id = content align = center>

<p align=center><font size=7>LabelMe Dev</font></p>
<br />
<br />

<label> Please Enter the <b><i>Username</i></b></label>
<br />
<br />

<input type=text name = usrfield id = usrfield onkeydown=if (event.keyCode == 13) document.getElementById('btnSearch').click()/>
<br />
<br />
<br />

<label> Please Enter the <b><i>Password</i></b></label>
<br />
<br />
<input type=password name = passfield id = passfield onkeydown=if (event.keyCode == 13) document.getElementById('btnSearch').click()/>
<br />
<br />
<br />

<i><p id='valueerrorlayer' style=color:red;> </p></i>

<input type=submit value=Submit/>
</div>
</form>
</body>





</html>


The problem is that console.log(req.session); gives undefined so the req.session.user_id = 'xyz'; also not works and error 'TypeError: Cannot set property 'user_id' of undefined at /opt/expressjs/app.js:59:24 at callbacks' comes.
I have gone through many questions but was not able to figure out.



My website is static and all the *.html locates in the public directory


More From » node.js

 Answers
18

The session middleware checks if an incoming request matches the cookie path; if not, it doesn't bother continuing (and req.session won't even be created). In your situation, your cookie path is set to /public/, which doesn't match the request path /login.



I think you'd want to configure the session middleware cookie to use / as a path:



app.use(express.session({
cookie: {
path : '/',
httpOnly: false,
maxAge : 24*60*60*1000
},
secret: '1234567890QWERT'
}));

[#73209] Saturday, January 11, 2014, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
parker

Total Points: 259
Total Questions: 109
Total Answers: 97

Location: Zambia
Member since Thu, Jun 25, 2020
4 Years ago
;