我目前正在与一小组开发人员合作开发基于文本的游戏。游戏需要登录,我们使用MEAN(MongoDB,Express,Angular,Node)堆栈作为应用程序代码库,但是我坚持认证,作为rails开发人员,我习惯于能够放入一个gem并使用帮助者。
有没有人有MEAN和身份验证的经验?
答案 0 :(得分:32)
linnovate的MEAN堆栈使用Passport.js进行身份验证。 Passport使用不同的身份验证策略。其中一种策略是用户名和密码对,他们称之为 LocalStrategy 。
以下是Passportjs-Local Github Examples Page
中的一个样本第1步:需要Passport
首先,在执行npm install passport
后需要模块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步:在应用上初始化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步:设置会话 您可能必须为存储在会话中的User对象创建自己的序列化。这是通过以下
完成的// 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);
});
});
答案 1 :(得分:2)
您可以查看http://meanjs.org/ 他们有一个非常可靠的passport.js策略集成。 特别有用的是Salt和Crypto-Technies的实现,以使集成安全。在回购中搜索Salz。
请参阅 https://github.com/meanjs/mean/blob/master/modules/users/server/config/strategies/local.js 用于序列化和反序列化。
答案 2 :(得分:1)
或者,如果您不喜欢自定义实施,我最近发布了一个完整的MEAN Stack User Registration and Login Example
这是处理身份验证的用户服务的代码段:
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;
}
答案 3 :(得分:-3)
或者使用具有开箱即用的用户管理功能的mean.io。