【问题标题】:How to log out from basicAuth (Express)如何从 basicAuth (Express) 中注销
【发布时间】:2013-04-27 22:31:42
【问题描述】:

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

有人有想法吗?

提前致谢

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

【问题讨论】:

  • This StackOverflow 问题有一个注销示例 最简单的答案是“在注销时更新 req.session 变量”。
  • 看看passport passportjs.org 模块和passport-local github.com/jaredhanson/passport-local。通过调用 req.logout() 可以轻松注销。如果您愿意,Passport 还可以让您在将来轻松添加其他身份验证方法

标签: node.js express basic-authentication


【解决方案1】:

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

express.basicAuth() 调用 require(blah-blah/connect/lib/utils).unauthorized() 发送一个带有标题“WWW-Authenticate: Basic realm="..."' 的 401 状态。浏览器处理身份验证窗口,从那时起发送一个标题,如“授权:基本 YmFzaWM6YmFzaWM=”,其中包含用户名和密码。

(express.basicAuth 不安全,尤其是通过 HTTP,因为您可以使用

获取用户名:密码
new Buffer('YmFzaWM6YmFzaWM=' , 'base64').toString() 

在这种情况下给出 basic:basic。)

我们的问题是 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');
});

附:你的英语很好。

【讨论】:

  • 嘿,小问题,next();功能做什么?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    添加到 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() if you don't want to send any message
    });
    

    【讨论】:

      【解决方案4】:

      我已经确认将用户重定向到带有 http 代码 401 的 /logout 页面和带有 &lt;a&gt; 元素链接到 /login 的 html 有效。

      【讨论】:

        猜你喜欢
        • 2015-09-14
        • 2015-11-13
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 2021-01-24
        • 2017-12-31
        • 2015-08-07
        相关资源
        最近更新 更多