2013-09-09 4 views
15

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

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

+1

есть easyauth для фб, твиттер и т.д. Логин: https://github.com/bnoguchi/everyauth –

ответ

31

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

Вот один из образцов из Passportjs-Local Github Examples Page

Шаг 1: Требуют паспорт

Сначала вам потребуется модуль после выполнения НПМ установить паспорт

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: Настройка Middleware на входе 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: Настройка Sessions Вы, возможно, придется создать свой собственный сериализации для объектов пользователей, которые в настоящее время хранятся в сессиях. Это делается со следующими

// 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); 
    }); 
}); 
-3

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

+0

Да - но было бы здорово иметь паспортный пакет, чтобы мы могли «означать установку паспорта» – itamar

1

Вы можете взглянуть на http://meanjs.org/ У них очень прочная интеграция стратегий passport.js. Особо полезной является реализация Соля и Криптотехнов для обеспечения безопасности интеграции. Поиск Salz в рамках репо.

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

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; 
} 
Смежные вопросы