2015-03-16 3 views
1

Я использую Express 4 с Node.js. Я успешно реализовал Passport для аутентификации с именем пользователя/паролем. Но как мне получить Passport для аутентификации только с информацией о сеансе?Экспресс: использование паспорта для аутентификации с использованием сеанса

Как создать пользовательскую стратегию Passport для получения информации о сеансе и сравнить ее с информацией конкретного пользователя?

Я ищу это:

passport.use(new SessionStrategy(function(req,res,done){ 
    if(req.session blah blah blah){ 
??? 
    } 
}); 
); 

Я действительно понятия не имею, что лучший способ сделать это. Возможно, я храню последнюю информацию о сеансе пользователя в базе данных. Итак, вместо того, чтобы найти пользователя со своим именем пользователя, я нахожу пользователя с sessionid?

Один ответ, кажется, следующее:

Это код поместить идентификатор сеанса в куки и получить данные, когда пользователь возвращается. Никакой стратегии не требуется.

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findById(id, function (err, user) { 
    done(err, user); 
    }); 
}); 

ответ

1

У вас есть два варианта:

  1. Используйте постоянного сеанс магазин
  2. JSON Web лексем

Для осуществления постоянного сеанса, вы можете использовать MongoDB сеанс магазин или Redis магазин Session ,

Если вы хотите использовать redis, воспользуйтесь connect-redis пакетом npm. Если вы хотите использовать MongoDb в качестве хранилища сеансов, используйте connect-mongo npm package

Есть некоторые настройки, которые вам нужно сделать в вашем приложении app.js/server.js. В одном из моих демо я использую Redis Session store с PassportJS, если вы ищете пример, не стесняйтесь смотреть here.

Если вы хотите использовать токены JSON, существует множество различных реализаций. Я использую jsonwebtoken. Я реализовал это, используя PassportJS, ExpressJS и AngularJS в передней части End. Например, посмотрите here. Токены кодируются и хранятся в локальном хранилище браузера с помощью секретного ключа.

Я бы предложил вам пойти на токены JSON, прочитать его подробно, потому что именно так развиваются большинство основных веб-приложений.

Оба моих примера работают прототипом. Дай мне знать, если тебе еще понадобится помощь.

+0

https://github.com/narendrasoni1989/mean-jwt-auth/blob/master/app.js просто FYI этот кодовый блок в вашем коде появляется дважды без причины - app.use (функция (req, res, next) { res.setHeader ('Access-Control-Allow-Origin', '*'); res.setHeader ('Access-Control-Allow-Methods', 'GET, POST'); res.setHeader ('Access-Control-Allow-Headers', 'X-Requested-With, content-type, Authorization'); next(); }); –

+0

Ой, спасибо большое, я изменю это. – NarendraSoni

1

Идеальный способ сделать это - сохранить идентификатор пользователя в сеансе (или JWT как упомянутый @NarendraSoni). Основная идея заключается в том, чтобы хранить как можно меньше полезной информации в сеансе, так как вы должны относиться к ней так, как будто она общедоступна для всех.

Если вы, например, храните только идентификатор пользователя, то каждый раз, когда вы получаете запрос (например, req.session.userId), вы можете просто выполнить запрос базы данных, чтобы получить этого пользователя по идентификатору.

Это быстро (особенно если вы используете кеш-сервер, такой как memcached или redis) и вызывает очень мало задержек. Он также защищен и предотвращает утечку информации пользователя в браузер.

Если вы ищете более простой способ обработки этого материала в своем приложении, вы можете проверить мою библиотеку аутентификации: express-stormpath. Он делает все это из коробки, очень безопасен и предоставляет множество вспомогательных утилит, чтобы ускорить работу: вы можете хранить пользовательские данные в аккаунтах (например, монго), вы можете ограничить пользователей на основе разрешений, вы можете сделать Аутентификация API и т. Д.

Смежные вопросы