如何从BASICAUTH注销(快递)

问题描述 投票:11回答:3

我试图设置使用快递的Web服务器。要访问此服务器,用户必须进行身份验证,并对于这一点,我用快递提供的BASICAUTH()中间件。它完美的作品,但我不知道该怎么注销一次我登录!我不得不关闭我的浏览器断开,而是我想有一个“断开”网页,其中将朝着“登录”页面(这与一个用于登录......可怕的形式)重定向。

有没有人有一个想法?

每提前感谢

PS:我很抱歉,我可怜的英语:)

node.js express basic-authentication
3个回答
22
投票

快报BASICAUTH使用HTTP基本身份验证,其实现不需要HTML页面,饼干也不会话ID。它的主要缺点是其并不安全,我们关注这里,有在规范的服务器,以指示浏览器退出的机制。

express.basicAuth()调用需要.unauthorized(夸夸其谈/连接/ LIB / utils的)(),其发送具有报头401个状态 'WWW身份验证:基本境界= “...”'。该浏览器处理的验证窗口,从那时起发送,如“授权:基本YmFzaWM6YmFzaWM =”的报头包含的用户名和密码。

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

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

这给基本:基本在这种情况下)

我们的问题是HTTP规范不提供一种方法来阻止这个头被发送。一种用于HTTPS解决方法是将用户重定向到在具有不正确的凭据同一个域中的URL。

我使用的HTTP解决方法快速V3可以app.use使用(express.basicAuth(...))。我觉得这是更容易比需要调用其他的解决方案使用在每一个安全的路线,例如到中间件app.get( '/安全',checkAuth,功能(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');
});

附:你的英语非常好。


10
投票

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

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

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
});
© www.soinside.com 2019 - 2024. All rights reserved.