我必须使用身份验证然后为此创建一个会话我有一个在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);
https://localhost:8888
时,它会不断加载页面并且不会重定向到xyz.html,我必须输入凭据来验证用户身份吗?当我发表评论时
app.use(express.session({cookie:{httpOnly:false,maxAge:24 * 60 * 60 * 1000},secret:'1234567890QWERT'}));
然后页面正确加载但是当我将表单发布到/ login时,它表示无法写入req.session。为此,我知道因为我已经注释了express.session,但奇怪的是connect.sid cookie被创建了。为什么?
我对问题1和2感到困惑。
答案 0 :(得分:1)
我试过你的例子,它对我有用。您确定在浏览器中使用https
协议吗?默认情况下,浏览器将尝试使用HTTP协议进行连接,除非您重定向到HTTP。使用您的设置,导航到此URL只会旋转:
http://localhost:8888
但是,如果您导航到此网址:
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上运行:您可以在8887上运行HTTPS服务器,并在8888上运行HTTP重定向服务器。