如何从basicAuth(Express)注销

时间:2013-05-03 13:39:01

标签: node.js express basic-authentication

我正在尝试使用express设置Web服务器。要访问此服务器,用户必须进行身份验证,为此,我使用Express提供的basicAuth()中间件。它工作得很好,除了我登录后不知道如何注销!我必须关闭我的浏览器以断开连接,但我希望有一个“断开连接”页面,它将重定向到“登录”页面(这个用于登录的可怕形式......)。

有没有人有想法?

先谢谢

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

4 个答案:

答案 0 :(得分:22)

Express'basicAuth使用HTTP基本身份验证,其实现不需要HTML页面,cookie或会话ID。它的主要缺点是它不安全,而且我们担心这里,规范中没有机制指示浏览器注销。

express.basicAuth()调用require(blah-blah / connect / lib / utils).unauthorized(),它使用标题'WWW-Authenticate:Basic realm =“...”'发送401状态。浏览器处理身份验证窗口,从此开始发送一个标题,如'Authorization:Basic YmFzaWM6YmFzaWM =',其中包含用户名和密码。

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

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

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

我们的问题是HTTP规范没有提供停止发送标头的方法。 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>',
    '&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');
});

P.S。你的英语很棒。

答案 1 :(得分:10)

对于express.js 4和basicAuth,您可以使用此方法:

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

答案 2 :(得分:0)

添加到wyllman的401代码为Unauthorized。 您可以简单地通过res.status(401).send('Logged out')

进行回复

app.get('/logout', function (req, res) {
    res.status(401).send('Logged out')
    //or res.status(401).end() to force the user to log in on next visit
});

答案 3 :(得分:0)

我已经确认,将用户重定向到带有http代码401的/ logout页面和带有<a>元素链接到/ login的html都是可行的。