![](/img/trans.png)
[英]How can I check currently logged user in user authentication on Mean Stack (Node.js + Mongodb)?
[英]How to do Authentication with Node.js and MEAN stack?
我目前正在與一個小型開發團隊合作開發基於文本的游戲。 游戲需要登錄,我們使用MEAN(MongoDB,Express,Angular,Node)堆棧作為應用程序代碼庫,但是我堅持認證,作為rails開發人員,我習慣於能夠放入一個gem並使用助手可用。
有沒有人有MEAN和身份驗證的經驗?
linnovate的MEAN堆棧使用Passport.js進行身份驗證。 Passport使用不同的身份驗證策略。 其中一個策略是用戶名和密碼對,他們稱之為LocalStrategy 。
以下是Passportjs-Local Github 示例頁面中的一個示例
第1步:要求Passport
首先你做了npm安裝護照后需要模塊
var passport = require('passport');
第2步:配置“驗證”功能
使用Passport中的LocalStrategy。 護照中的策略需要verify
功能,該函數接受憑證(在本例中為用戶名和密碼),並使用用戶對象調用回調。 在現實世界中,這將查詢數據庫; 但是,在這個例子中,我們使用了一組用戶。
passport.use(new LocalStrategy(
function(username, password, done) {
// Find the user by username. If there is no user with the given
// username, or the password is not correct, set the user to `false` to
// indicate failure and set a flash message. Otherwise, return the
// authenticated `user`.
findByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Unknown user ' + username });
}
if (user.password != password) {
return done(null, false, { message: 'Invalid password' });
}
return done(null, user);
})
});
}
));
第3步:在app上初始化Passport
您需要告訴Express您將使用護照並且它將為您管理會話。 這是通過在應用程序配置期間使用app.use()來完成的。
app.use(passport.initialize());
app.use(passport.session());
步驟4:在登錄URI上配置中間件
接下來,我們需要創建一個方法,當用戶嘗試通過POST到特定URI來登錄應用程序時,該方法將接受。 它看起來像這樣。
// POST /login
// Use passport.authenticate() as route middleware to authenticate the
// request. If authentication fails, the user will be redirected back to the
// login page. Otherwise, the primary route function function will be called,
// which, in this example, will redirect the user to the home page.
//
// curl -v -d "username=bob&password=secret" http://127.0.0.1:3000/login
app.post('/login',
passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }),
function(req, res) {
res.redirect('/');
});
步驟5:設置會話您可能必須為存儲在會話中的用戶對象創建自己的序列化。 這是通過以下方式完成的
// Passport session setup.
// To support persistent login sessions, Passport needs to be able to
// serialize users into and deserialize users out of the session. Typically,
// this will be as simple as storing the user ID when serializing, and finding
// the user by ID when deserializing.
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
findById(id, function (err, user) {
done(err, user);
});
});
你可以看看http://meanjs.org/他們有一個非常可靠的passport.js策略集成。 特別有用的是Salt和Crypto-Technies的實現,以使集成安全。 在回購中搜索薩爾茨。
請參閱https://github.com/meanjs/mean/blob/master/modules/users/server/config/strategies/local.js用於序列化和反序列化。
或者,如果您更喜歡自定義實現,我最近發布了一個完整的MEAN堆棧用戶注冊和登錄示例
以下是處理身份驗證的用戶服務的代碼段:
function authenticate(username, password) {
var deferred = Q.defer();
usersDb.findOne({ username: username }, function (err, user) {
if (err) deferred.reject(err);
if (user && bcrypt.compareSync(password, user.hash)) {
// authentication successful
deferred.resolve(jwt.sign({ sub: user._id }, config.secret));
} else {
// authentication failed
deferred.resolve();
}
});
return deferred.promise;
}
或者使用具有開箱即用的用戶管理功能的mean.io.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.