Авторизация
Для авторизации пользователей используется nodejs библиотека passport и его расширение LocalStrategy.
Весь код расположен в файле src/passport.js
В качестве особенностей реализации, следует обратить внимание на события, которые инициирует библиотека при попытках пройти авторизацию - localauth.
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var mongoose = require('mongoose');
var event = require('events').EventEmitter;
passport.Events = new event();
passport.use(new LocalStrategy(
function(username, password, done) {
username = (username+'').toLowerCase().trim();
mongoose.model('user').findOne({ LoginUser: username }).isactive().exec(function (err, user) {
if (err) {
return passport.Events.emit('localauth',{status:"error",message:err,username:username});
}
if (!user) {
return passport.Events.emit('localauth',{status:"error",message:"wrongusername",username:username});
}
if (!user.IsConfirmed) {
return passport.Events.emit('localauth',{status:"error",message:"notconfirmed",username:username});
}
if (!user.checkPassword(password)) {//
return passport.Events.emit('localauth',{status:"error",message:"wrongpassword",username:username});
}
passport.Events.emit('localauth',{status:"success",user:user._id,username:username});
});
}
));
module.exports = passport;
Когда в системе появляется необходимость расширения функционал модуля авторизации, достаточно подписаться на события авторизации и не писать свой код в этом модуле.
Например, модуль audit следит за количеством попыток, блокирует учетную запись при большом количестве ошибок авторизации и оповещает администратора о подозрительном поведении пользователей. Для своей работы ему достаточно подписаться на события localauth.
Использование библиотеки passport было выбрано с перспективой на вырост. К этой библиотеке написано множество плагинов авторизации включая стандарты OAuth1, OAuth2, LDAP и др.
Пока система авторизации работает только по паре Логин + Пароль.