Express" BasicAuth"使用异步检查凭据

时间:2015-01-21 14:53:42

标签: javascript node.js express basic-authentication

我正在将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
});

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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