使用 Mongoose 和 ExpreeJS 对用户进行身份验证的最佳方法是什么。
我正在使用 mongoose 3.x,看起来这个包不再更新:https ://github.com/bnoguchi/mongoose-auth
理想情况下,我也可以使用 twitter 和 facebook 对用户进行身份验证。
使用 Mongoose 和 ExpreeJS 对用户进行身份验证的最佳方法是什么。
我正在使用 mongoose 3.x,看起来这个包不再更新:https ://github.com/bnoguchi/mongoose-auth
理想情况下,我也可以使用 twitter 和 facebook 对用户进行身份验证。
我总是不喜欢对每个问题都使用插件或模块。只使用猫鼬你可以这样做:
为您的 mongoDB 配置提供一个 db.js
var mongoose = require('mongoose');
mongoose.connect("mongodb://...");
var userSchema = new mongoose.Schema({
username: String,
salt: String,
hash: String
});
exports.User = mongoose.model("user", userSchema);
使用 TJ 的pass.js文件来散列密码。它使用crypto.pbkdf2进行加密。
手动创建用户或使用表单允许自行注册:
var db = require('./db');
var pwd = require('./pwd');
var user = new db.User();
user.username = "Admin";
pwd.hash("adminPassword", function(err, salt, hash) {
if (err) {
console.log(err);
}
user.salt = salt;
user.hash = hash;
user.save(function(err) {
if (err) {
console.log(err);
} else {
console.log("user saved");
}
});
});
现在您的数据库中应该有一个用户名、加密密码和哈希。要检查登录,请使用中间件功能:
function authenticate(name, pass, fn) {
db.User.findOne ({username: name}, function(err, user) {
if (!user) return fn(new Error('cannot find user'));
hash(pass, user.salt, function(err, hash){
if (err) return fn(err);
if (hash == user.hash) return fn(null, user);
fn(new Error('invalid password'));
})
})
}
app.post('/login', function(req, res){
authenticate(req.body.username, req.body.password, function(err, user){
if (user) {
req.session.regenerate(function(){
req.session.user = user;
res.redirect('back');
});
} else {
res.redirect('login');
}
});
});
// middleware
function restrict(req, res, next) {
if (req.session.user) {
next();
} else {
req.session.error = 'Access denied!';
res.redirect('/login');
}
}
// route with restrict middleware
app.get('/restricted', restrict, function(req, res){
res.send('Wahoo! restricted area');
});
大部分代码取自auth示例,我添加了 mongoose 的内容。希望这可以帮助!
在学习如何使用 MongoDB 和 Node 执行此操作时,我使用了这个示例:
https://github.com/braitsch/node-login
我认为这是自己进行用户身份验证的一个非常好的孤立示例。它使用 bcrypt 对用户密码进行散列和加盐。如果您查看AccountManager内部,您可以看到它是如何与 Mongo 数据库一起工作的。
但是,如果您希望使用其他策略进行身份验证,我建议您查看Passport.js。我还没有机会使用它,但我认为它看起来相当发达且足够简单。也许您可以根据您的经验更新此页面。
Everyauth是另一种选择,特别是如果您正在寻找通过 twitter 和 facebook 等第三方进行身份验证的灵活性和支持。
请参阅作者在另一个 SO 问题中的这篇文章,以全面了解其功能和优势。