如何从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.', '<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'); });
PS你的英语非常好。
对于express.js 4和basicAuth,你可以使用这个方法:
app.get('/logout', function (req, res) { res.set('WWW-Authenticate', 'Basic realm=Authorization Required'); return res.sendStatus(401); });
- 使用来自envvariables的令牌从私有Github repo安装NPM包
- 如何向Google Analytics报告API v4进行身份validation
- 为restify.js实现基于令牌的身份validation的最佳方式是什么?
- Firebase身份validationID令牌具有不正确的“审核”声明
- JWT微服务体系结构中的身份validation
- 未知的身份validation策略护照
- 使用passport.js将本地策略连接到另一个(Facebook,Twitter,Google等)
- 如何使用feathersjs-authentication将JWT令牌发送到客户端?
- Auth0 req.user.sub返回false