具有Express和Mongoose的BasicAuth
我试图添加一个基本的身份validation到我的Expresspath。 要检查组合用户/传递是否正确,我读取MongoDB数据库中的集合usermodels。 这是我的代码:
server.js
var normal = express.basicAuth(normalAuth); app.get('path', normal, function(req, res){etc.}); function normalAuth(user, pass) { var mongo = require('./database/userManager'); var result = false; mongo.start(mongo.list(function(err, data) { if(err) { throw err; } else { console.log('Getting list from db...'); for(var i in data) { console.log('Getting details from db...'); if(user == data[i].name && pass == data[i].pass) { console.log('New connection : ' + user); result = true; break; } else { console.log('Failed connection : ' + user); result = false; } } console.log('OK'); } mongo.mongoose.connection.close(); })); return result; }
userManager.js
var mongoose = require('mongoose'); var userModel = mongoose.connection.model('usermodel', new mongoose.Schema({ name: String, pass: String, status: { type: Boolean, default: false } }), 'usermodels'); function start(callback) { mongoose.connect('mongodb://localhost/derp', function(err) { if(err) { throw err; } else { console.log('Connected to database '); } }); } function list(callback) { userModel.find(callback); }
身份validation几乎可以工作,它连接到数据库并获取信息。 它在控制台上打印
"New connection : /*user connected*/".
但有一个问题:我的函数normalAuth总是返回false,所以即使我有正确的用户/密码,我不能访问页面,我有连接窗口,如果我给错了用户/密码。 我想这是因为这个函数返回结果之前,我的mongo.start(blabla)完成,但我不知道该怎么做。
感谢您的帮助。
您总会得到错误的结果,因为在Node.js中,每个IO操作都是asynchronous的 。
让我来解释一下 :当你调用mongo.start(...)
函数时,Node.js会把它放到另一个操作队列中,因为它是IO操作。 主操作队列不能被阻塞,这就是IO操作总是asynchronous的原因。 将mongo函数放入另一个操作队列中,您的主操作队列将继续并到达代码行: return false
。 而且无论函数mongo.start(...)
如何处理,它都会返回false。
解决方法是通过发送callback函数:
function normalAuth(user, pass, callbackResult) { var mongo = require('./database/userManager'); mongo.start(mongo.list(function(err, data) { if(err) { throw err; } else { console.log('Getting list from db...'); for(var i in data) { console.log('Getting details from db...'); if(user == data[i].name && pass == data[i].pass) { console.log('New connection : ' + user); // here you send true to callback function callbackResult(true); break; } else { console.log('Failed connection : ' + user); // here you send false to callback function callbackResult(false); } } console.log('OK'); } mongo.mongoose.connection.close(); })); }
你可以这样调用这个函数:
normalAuth(user, pass, function(result) { if(result) console.log("Auth OK"); else console.log("Auth Failed"); }
编辑 :在express.basicAuth
函数中,它将被这样调用:
app.use(express.basicAuth(function(user, pass, callback) { normalAuth(user, pass, function(result) { callback(null /* error */, result); } }));
- Sails.js 0.11和护照:“Missing Credentials”错误
- 处理令牌的体系结构(NodeJS)(MongoDB)
- 使用app.set('app_secret',data)将密钥存储在nodejs中是否安全?
- 如何在服务器端(Node.js)以编程方式validationFacebook用户的访问令牌?
- 如何使用htaccess的替代密码保护nodejs应用程序
- 第三方用户使用电子validation
- 在某些REST API上select性启用HTTP基本authentication
- 基于REST / Web的身份validation即服务的可能性?
- 本地testingAzure Mobile Auth – 无效的jwt签名