Что делает pass.session() промежуточное ПО?
Я создаю систему аутентификации, используя Passport.js, используя Easy Node Authentication: Setup и Local tutorial.
Я не совсем понимаю, что делает passport.session()
.
После игры с другим промежуточным программным обеспечением я понял, что express.session()
- это то, что посылает клиенту идентификатор сеанса через куки, но я не совсем понимаю, что делает passport.session()
и почему он требуется в дополнение к express.session()
.
Вот как я настроил свое приложение:
//Server.js настраивает приложение и настраивает веб-сервер
//importing our modules
var express = require('express');
var app = express();
var port = process.env.PORT || 8080;
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');
var configDB = require('./config/database.js');
//Configuration of Databse and App
mongoose.connect(configDB.url); //connect to our database
require('./config/passport')(passport); //pass passport for configuration
app.configure(function() {
//set up our express application
app.use(express.logger('dev')); //log every request to the console
app.use(express.cookieParser()); //read cookies (needed for auth)
app.use(express.bodyParser()); //get info from html forms
app.set('view engine', 'ejs'); //set up ejs for templating
//configuration for passport
app.use(express.session({ secret: 'olhosvermelhoseasenhaclassica', maxAge:null })); //session secret
app.use(passport.initialize());
app.use(passport.session()); //persistent login session
app.use(flash()); //use connect-flash for flash messages stored in session
});
//Set up routes
require('./app/routes.js')(app, passport);
//launch
app.listen(port);
console.log("Server listening on port" + port);
Ответы
Ответ 1
passport.session()
действует как промежуточное ПО для изменения объекта req и изменения значения "user", которое в настоящее время является идентификатором сеанса (из файла cookie клиента), в истинно десериализованный пользовательский объект.
В то время как другие ответы содержат некоторые хорошие моменты, я подумал, что может быть предоставлена более конкретная деталь.
app.use(passport.session());
эквивалентно
app.use(passport.authenticate('session'));
Где "сессия" относится к следующей стратегии, которая связана с passportJS.
https://github.com/jaredhanson/passport/blob/master/lib/strategies/session.js
Конкретно строки 59-60:
var property = req._passport.instance._userProperty || 'user';
req[property] = user;
Где он по существу действует как промежуточное ПО и изменяет значение свойства 'user' в объекте req, чтобы содержать десериализованную идентичность пользователя. Чтобы это работало правильно, вы должны включить функции serializeUser
и deserializeUser
в свой пользовательский код.
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (user, done) {
//If using Mongoose with MongoDB; if other you will need JS specific to that schema.
User.findById(user.id, function (err, user) {
done(err, user);
});
});
Это найдет правильного пользователя из базы данных и передаст его как переменную закрытия в callback done(err,user);
поэтому приведенный выше код в passport.session()
может заменить значение 'user' в объекте req и перейти к следующему промежуточному программному обеспечению в куче.
Ответ 2
Из документации
В приложении Connect или Express, passport.initialize() для инициализации Passport требуется промежуточное ПО. Если ваша заявка использует постоянные сеансы входа в систему, pass.session() промежуточное программное обеспечение должно также можно использовать.
и
Сеансы
В типичном веб-приложении учетные данные, используемые для аутентификации пользователь будет передан только во время запроса на вход. Если проверка подлинности будет успешной, будет создан и поддерживается сеанс через набор файлов cookie в браузере пользователя.
Каждый последующий запрос не содержит учетных данных, а уникальный cookie, который идентифицирует сеанс. Чтобы поддержать логин сеансов, Passport будет сериализовать и десериализовать пользовательские экземпляры для и из сеанса.
и
Обратите внимание, что включение поддержки сеанса полностью необязательно, хотя оно рекомендуется для большинства приложений. Если включено, обязательно используйте express.session() перед паспортом .session(), чтобы убедиться, что логин сеанс восстанавливается в правильном порядке.
Ответ 3
Пока вы используете PassportJs
для проверки пользователя как части вашего URL-адреса входа, вам по-прежнему нужен какой-то механизм для хранения этой информации пользователя в сеансе и получения его с каждым последующим запросом (например, сериализация/десериализация пользователя),
Таким образом, вы выполняете аутентификацию пользователя с каждым запросом, даже если эта проверка подлинности не требует поиска базы данных или oauth, как в ответе на вход. Таким образом, паспорт будет обрабатывать сеансовую аутентификацию также как еще одну стратегию аутентификации.
И для использования этой стратегии, которая называется session
, просто используйте простой ярлык - app.use(passport.session())
. Также обратите внимание, что эта конкретная стратегия захочет, чтобы вы реализовали функции сериализации и десериализации по очевидным причинам.
Ответ 4
Он просто аутентифицирует сеанс (который заполняется express.session()
). Это эквивалентно:
passport.authenticate('session');
как видно из кода здесь:
https://github.com/jaredhanson/passport/blob/master/lib/authenticator.js#L236
Ответ 5
Я был бы рад, если бы кто-нибудь мог ответить на вопрос о Google, который написал Джаред. Это последний вопрос спасибо.