Как выполнить проверку подлинности с помощью Node.js и стека MEAN?

В настоящее время я работаю над текстовой игрой с небольшой командой разработчиков. Для игры требуется логин, и мы используем стек MEAN (MongoDB, Express, Angular, Node) для кодовой базы приложения, однако я застрял на аутентификации, как разработчик rails, я привык к тому, что могу драгоценный камень и использовать доступные помощники.

У кого-нибудь есть опыт работы с MEAN и аутентификацией?

Ответы

Ответ 1

стек MEAN linnovate использует Passport.js для его аутентификации. Паспорт использует различные стратегии аутентификации. Одной из этих стратегий является пара имени пользователя и пароля, которые они называют LocalStrategy.

Вот один из примеров из Passportjs-Local Github Примеры страниц

Шаг 1: Требовать паспорт

Сначала вам понадобится модуль после установки патча npm install

var passport = require('passport');

Шаг 2: Настроить функцию "Проверить"

Используйте 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.use() во время настройки приложения.

app.use(passport.initialize());
app.use(passport.session());

Шаг 4. Настройка промежуточного ПО в URI входа в систему

Далее нам нужно создать метод, который будет принимать, когда пользователь попытается войти в приложение, используя POST-ing для определенного 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);
  });
});

Ответ 2

Вы можете посмотреть http://meanjs.org/ Они очень усложняют интеграцию паспортных стратегий. Особенно полезно внедрение Salt и Crypto-Technies для обеспечения безопасности интеграции. Найдите Salz eitin the repo.

См https://github.com/meanjs/mean/blob/master/modules/users/server/config/strategies/local.js Для сериализации и десериализации.

Ответ 3

Или, если вы предпочтете собственную реализацию, я недавно опубликовал полный MEAN Stack User Registration и 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;
}

Ответ 4

Или используйте mean.io, у которого есть управление пользователями из коробки.