2012-09-22 34 views

回答

3

我學習的時候如何使用MongoDB的和節點做到這一點用這個例子。它使用bcrypt來哈希和salt用戶密碼。如果你看看AccountManager你可以看到它如何與Mongo數據庫一起工作。

但是,如果您想使用其他策略進行身份驗證,我建議您查看Passport.js。我沒有機會使用它,但我認爲它看起來非常發達並且足夠簡單。也許你可以用你的經驗更新這個頁面。

+0

謝謝。我在看護照,但我認爲它不夠靈活,我看不到一種方式來定製用戶如何進行身份驗證。我會通過節點登錄代碼達到頂點,並且在玉石上c :) :) – chovy

+0

我也在翡翠中徘徊。我自己是[EJS](embeddedjs.com)的人。無論您使用什麼模板(如果有),您都應該能夠使用節點登錄作爲指導。 –

9

我總是不願爲每個問題使用插件或模塊。只用貓鼬,你可以做這樣的:

有一個db.js您的MongoDB配置

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例如採取和我加了東西的貓鼬。希望這可以幫助!

+1

這非常有幫助。謝謝。 –

0

Everyauth是另一種選擇,尤其是如果您正在尋找許多靈活性並支持通過第三方(如twitter和facebook)進行身份驗證。

請參閱this post來自作者的另一個SO問題,以便全面瞭解其功能和優點。