【问题标题】:Trouble using express.session with https将 express.session 与 https 一起使用时遇到问题
【发布时间】:2014-01-29 20:03:13
【问题描述】:

我必须使用身份验证,然后为此创建一个会话,我有一个在 expressjs 上运行的 HTTPS 静态网站

代码:

app.js:

//created the https server

var express = require('express');
var https = require('https');
var http = require('http');
var fs = require('fs');
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('localhost:27017/svgtest1');

// This line is from the Node.js HTTPS documentation.
var options = {
  key: fs.readFileSync('privatekey.pem'),
  cert: fs.readFileSync('certificate.pem')
};

// Create a service (the app object is just a callback).
var app = express();

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


// 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('xyz.html');
  res.end();
});

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

    // Play with the username and password

    if (usrfield == 'xxx' && passfield == 'xxx') {
    req.session.user_id = '123';
    res.redirect('abc.html');
  } else {
    res.send('Bad user/pass');
  }


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


// Create an HTTPS service.
https.createServer(options, app).listen(8888);
  1. 当我访问https://localhost:8888 时,它会不断加载页面,并且不会重定向到 xyz.html,我必须在其中输入凭据来验证用户身份?
  2. 当我注释掉

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

然后页面加载正确,但是当我将表单发布到 /login 时,它说 req.session 无法写入。为此我知道,因为我已经注释掉了 express.session,但奇怪的是创建了 connect.sid cookie。为什么 ?

我对问题 1 和 2 感到困惑。

【问题讨论】:

    标签: javascript node.js session https express


    【解决方案1】:

    我试过你的例子,它对我有用。你确定你在浏览器中使用https 协议吗?默认情况下,浏览器会尝试使用 HTTP 协议进行连接除非您重定向到 HTTP。使用您的设置,导航到此 URL 将会旋转:

    http://localhost:8888
    

    但是,如果您导航到此 URL:

    https://localhost:8888
    

    它将按预期工作。如果用户通过 HTTP 进入,大多数使用 HTTPS 的服务器会自动重定向到 HTTPS 连接,但您仍然必须拥有两台服务器:一台接受 HTTP 请求,另一台接受 HTTPS 请求。例如,您可以这样做:

    // create an HTTPS service
    https.createServer(options, app).listen(443);
    
    // create HTTP service to redirect to HTTPS
    http.createServer(express().use(function(req,res){
        res.redirect('https://localhost:443' + req.url);
    })).listen(8888);
    

    请注意,如果您使用低于 1024 的端口(例如 443,这在 HTTPS 中很常见),您可能需要根据您的服务器设置来提升权限。在 OSX/Linux 中,您只需执行 sudo node app.js。当然你不必在 443 端口上运行:你可以让你的 HTTPS 服务器在 8887 上运行,而你的 HTTP 重定向服务器在 8888 上运行。

    【讨论】:

    • 是的,我确定并使用了“localhost:8888”,但浏览器只是旋转,服务器的控制台也会发送调用的第一页,如果我放置 console.log(redirected);服务器控制台也说重定向,但我的网页仍在加载,网页在同一页面上,没有重定向。只有当我注释掉 app.use(express.session({cookie: { httpOnly: false , maxAge: 24*60*60*1000}, secret: '1234567890QWERT'}));然后它可以工作,但随后 req.session 不能正常工作,但导航就可以了。
    • express.session 是否需要我可能不使用或不适用于 https 的任何先决条件?我有一个公开的静态网站及其 html 和 javascript
    • 好吧,我不确定发生了什么,因为您的代码完全按照编写的方式为我工作。我所做的是从这个问题中剪下你的代码,将其粘贴到一个名为app.js 的文件中。然后我创建了一个package.json 文件,并将Express 添加到它(npm install express --save),然后运行npm install 以便依赖项可用。然后,我使用openssl 生成了一个私钥和证书,将它们命名为与您的源匹配,然后运行它。
    • 也许您需要更新 Express?您的package.json 文件中指定了哪个版本的 Express?实际安装的是什么版本的 Express? (您可以检查node_modules/express/package.json 来确定。)
    • 我使用的是 Express 3.4.7
    猜你喜欢
    • 2013-03-20
    • 2021-07-15
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多