如何从basicAuth(Express)注销

我正在尝试使用express来设置Web服务器。 要访问此服务器,用户必须进行身份validation,为此,我使用Express提供的basicAuth()中间件。 它完美的工作,除了我不知道如何注销一旦我login! 我必须closures我的浏览器断开连接,但我想有一个“断开连接”的页面,将redirect到“login”页面(这与用于login的丑陋forms…)。

有没有人有一个想法?

感谢每一个进展

PS:我为我可怜的英语道歉:)

Express“basicAuth使用HTTP基本authentication,其实现不需要HTML页面,cookies或会话ID。 它的主要缺点是不安全,而且我们担心在这个规范中没有规定服务器指示浏览器注销的机制。

express.basicAuth()调用需要(blah-blah / connect / lib / utils).unauthorized(),它发送一个标题为“WWW-Authenticate:Basic realm =”…“的401状态。 浏览器处理authentication窗口,并从此发送一个包含用户名和密码的标题,例如“Authorization:Basic YmFzaWM6YmFzaWM =”。

(express.basicAuth不安全,尤其是通过HTTP,因为你可以得到用户名:密码

new Buffer('YmFzaWM6YmFzaWM=' , 'base64').toString() 

这在这种情况下给出基本的:基本的。)

我们的问题是HTTP规范没有提供停止发送头的方法。 HTTPS的解决方法是将用户redirect到具有不正确凭据的相同域中的URL。

用于Express V3的HTTP解决方法可以与app.use(express.basicAuth(…))一起使用。 我发现这比其他需要在每个安全路由中调用中间件的解决scheme更容易使用,例如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.', '&lt;br>', '<a href="./secure">Refresh this page without having to log in again.</a>', '&lt;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.', '&lt;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'); }); 

PS你的英语非常好。

对于express.js 4和basicAuth,你可以使用这个方法:

 app.get('/logout', function (req, res) { res.set('WWW-Authenticate', 'Basic realm=Authorization Required'); return res.sendStatus(401); });