【问题标题】:Express "BasicAuth" with async checking of credentials通过对凭据的异步检查来表达“BasicAuth”
【发布时间】:2015-01-22 19:53:28
【问题描述】:

我正在将 Express 从 3.x 迁移到 4.x,由于 Express 4 没有 basicAuth,我正在尝试将其替换为 basic-auth module

我遇到的问题是凭据的异步检查(通过我的user_tools.checkCredentials() 方法)。

这就是它在 3.x 中工作的方式:

var auth = function(req, res, next) {
  isFromLAN(req.ip, function(fromLAN) {
    if (fromLAN) {
      // console.log('LAN --> no auth needed');
      next();
    } else {
      // console.log(req.ip + ' --> WAN --> auth to pass');
      basicAuth(function(user, pass, callback) {
        user_tools.checkCredentials(user, pass, function(valid) {
         callback(null, valid);
        });
      })(req, res, next);
    }
  });
};

当前代码,在 checkCredentials 处静默失败:

var express = require('express');
var basicAuth = require('basic-auth');
var user_tools = require('./user-tools');

var app = express();

var auth = function(req, res, next) {
  function isFromLAN(ip) {
    console.log('isFromLAN()', ip);
    if (ip === '127.0.0.1') {
      return true;
    }
    return false;
  }

  if (isFromLAN(req.ip)) {
    // console.log('LAN --> no auth needed');
    next();
  } else {
    console.log(req.ip + ' --> WAN --> auth to pass');

    function unauthorized(res) {
      console.log('unauthorized --> 401');
      res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
      return res.sendStatus(401);
    }

    var user = basicAuth(req);
    console.log('basicAuth user:', user);

    if (!user || !user.name || !user.pass) {
      console.log('!user');
      return unauthorized(res);
    }

    user_tools.checkCredentials(user.name, user.pass, function(valid) {
      console.log('valid:', valid);
      if (valid) {
        return next();
      } else {
        return unauthorized(res);
      }
    });
  }
};

app.get('/restricted_api/:value', auth, function(req, res) {
  // do authorised stuff
});

【问题讨论】:

    标签: javascript node.js express basic-authentication


    【解决方案1】:

    问题在于bcrypt.compare 花了 1 分钟,这导致我假设请求已退出。

    使用较小的rounds 值(对于种子,在对密码进行哈希处理时)使compare 操作的响应时间更快。

    仅供参考,当使用 rounds 的默认值(10 --> 2^10 轮)将密码与使用种子创建的哈希进行比较时,我的 Raspberry Pi 需要 1 分钟。另一方面,使用 5 (2^5) rounds 种子散列的密码给了我 compare() 1 秒的响应。

    【讨论】:

      【解决方案2】:

      在连接 basicAuth 中间件 (http://www.senchalabs.org/connect/basicAuth.html) 中,设置了 req.user。在您的 express 4 版本中,我找不到该部分。我不确定这是否导致失败,因为函数(req,res)需要 req.user。

      【讨论】:

      • 不,我相信事实并非如此。我添加了req.user = user;,但真正的问题是console.log('valid:', valid) 在我的异步函数checkCredentials() 返回之前从未显示为auth() 中间件退出。 Express 3.x 有你链接的中间件,它有 var pause = utils.pause(req); 用于我没有的异步请求。
      • 这是我注意到的一件事。我在一个身份验证函数中使用了暂停,以便在身份验证期间捕获请求的数据/事件,然后释放这些数据/事件。有关详细信息,请参阅此内容 (stackoverflow.com/questions/13412157/…)。如果您需要发送请求正文/文件,则需要暂停。看来你找到了真正的问题。
      猜你喜欢
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 2016-03-26
      相关资源
      最近更新 更多