我正在尝试使用Express设置Web服务器。要访问此服务器,用户必须进行身份验证,为此,我使用Express提供的basicAuth()中间件。它运行完美,除了登录后我不知道如何注销!我必须关闭浏览器才能断开连接,但我想拥有一个“断开连接”页面,该页面将重定向到“登录”页面(此页面具有用于登录的丑陋形式...)。
有人有主意吗?
谢谢你提前
PS:我为我可怜的英语道歉:)
最佳答案
Express的basicAuth使用HTTP基本身份验证,其实现不需要HTML页面,Cookie或 session ID。它的主要缺点是它不安全,并且,在这里我们要关注的是,规范中没有用于服务器指示浏览器注销的机制。
express.basicAuth()调用require(blah-blah/connect/lib/utils).unauthorized()会发送401状态,标题为“WWW-Authenticate:Basic realm =“...”'。浏览器将处理身份验证窗口,然后会从发送一个 header ,例如“Authorization:Basic YmFzaWM6YmFzaWM =”,其中包含用户名和密码。
(express.basicAuth是不安全的,尤其是通过HTTP,因为您可以使用
new Buffer('YmFzaWM6YmFzaWM=' , 'base64').toString()
在这种情况下会给出basic:basic。)
我们的问题是HTTP规范没有提供停止发送该 header 的方法。 HTTPS的一种解决方法是将用户重定向到同一域上具有不正确凭据的URL。
我用于Express V3的HTTP解决方法可以与app.use(express.basicAuth(...))一起使用。我发现这比其他解决方案更容易使用,而其他解决方案则需要在每个安全路径中调用中间件,例如app.get('/secure',checkAuth,function(req,res){...})。
这是一个工作示例。
var express = require('express'),
http = require('http'),
app = express();
app.use(express.favicon()); // prevent interference during test
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({ secret: 'winter is coming' }));
app.use(function (req, res, next) {
if (!req.session.authStatus || 'loggedOut' === req.session.authStatus) {
req.session.authStatus = 'loggingIn';
// cause Express to issue 401 status so browser asks for authentication
req.user = false;
req.remoteUser = false;
if (req.headers && req.headers.authorization) { delete req.headers.authorization; }
}
next();
});
app.use(express.basicAuth(function(user, pass, callback) {
callback(null, user === 'basic' && pass === 'basic');
}, '***** Enter user= basic & password= basic'));
app.use(function (req, res, next) {
req.session.authStatus = 'loggedIn';
next();
});
app.use(app.router);
app.get('/secure', function (req, res) {
res.send([
'You are on a secured page.',
'<br>',
'<a href="./secure">Refresh this page without having to log in again.</a>',
'<br/>',
'<a href="./logout">Log out.</a>'
].join(''));
});
app.get('/logout', function (req, res) {
delete req.session.authStatus;
res.send([
'You are now logged out.',
'<br/>',
'<a href="./secure">Return to the secure page. You will have to log in again.</a>',
].join(''));
});
http.createServer(app).listen(3000, function(){
console.log('Express server listening on port 3000. Point browser to route /secure');
});
P.S.你的英语很好。