Express "BasicAuth" 异步检查凭据
Express "BasicAuth" with async checking of credentials
我正在将 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
});
在连接 basicAuth 中间件 (http://www.senchalabs.org/connect/basicAuth.html) 中,设置了 req.user。在您的 express 4 版本中,我找不到那部分。我不确定这是否导致失败,因为 function(req, res) 需要 req.user。
问题是 bcrypt.compare
花了 1 分钟,这让我假设请求已经退出。
使用较小的 rounds
值(对于种子,在散列密码时)使我对 compare
操作的响应时间更快。
仅供参考,当使用 rounds
的默认值(10 --> 2^10 轮)将密码与种子创建的哈希进行比较时,我的 Raspberry Pi 花费了 1 分钟。另一方面,用 5 (2^5) rounds
种子散列的密码给了我 compare()
1 秒的响应。
我正在将 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
});
在连接 basicAuth 中间件 (http://www.senchalabs.org/connect/basicAuth.html) 中,设置了 req.user。在您的 express 4 版本中,我找不到那部分。我不确定这是否导致失败,因为 function(req, res) 需要 req.user。
问题是 bcrypt.compare
花了 1 分钟,这让我假设请求已经退出。
使用较小的 rounds
值(对于种子,在散列密码时)使我对 compare
操作的响应时间更快。
仅供参考,当使用 rounds
的默认值(10 --> 2^10 轮)将密码与种子创建的哈希进行比较时,我的 Raspberry Pi 花费了 1 分钟。另一方面,用 5 (2^5) rounds
种子散列的密码给了我 compare()
1 秒的响应。