Подтвердить что ты не робот

Аутентификация токена паспорта * без * сеанса базы данных

Я ищу способ использовать стратегию Twitter для Passport.js без использования коллекции/таблицы сеансов в базе данных. Причина этого заключается в том, что мы сохраняем все эти данные в коллекции сеансов, которые могут быть довольно большими, и мы сохраняем обратную транзакцию базы данных всякий раз, когда пользователь делает запрос, потому что нам не нужно каждый раз обращаться к БД для получения данных сеанса.

В любом случае, мы должны иметь возможность использовать токен (JSON Web Token) для аутентификации пользователя, как описано в этой замечательной статье:

https://scotch.io/tutorials/authenticate-a-node-js-api-with-json-web-tokens

Но я смущен, почему нет простого способа сделать это с помощью Passport? (В статье делается все без паспорта, но верно ли это у Паспорта?).

Возможно, я слишком задумываюсь об этом, и способ сделать это - просто опустить вызовы, которые у меня есть в Express, чтобы использовать сеанс DB, а затем Passport уже достаточно умен, чтобы обрабатывать JWT? Почему-то я сомневаюсь в этом.

Например, конечно, недостаточно просто прокомментировать этот код на моем сервере Express:

//app.use(expressSession({
//    secret: 'arrete_x_paulette',
//    store: new MongoStore({mongooseConnection: mongoose.connection}),
//    saveUninitialized: true,
//    resave: true,
//    cookie: {
//        secure: false,
//        maxage: 6000000
//    },
//    proxy: false
//}));

и

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

Итак, что же, используя Passport?

Почему кто-либо когда-либо использовал сеансы, хранящиеся в БД, используя аутентификацию на основе JWT?

4b9b3361

Ответ 1

Обновление: лучшее решение - отключить сеансы вообще.

Я думаю, что удаление промежуточного программного обеспечения сеанса для экспресс и его отключение для паспорта, пройдя { session: false } к passport.authenticate, должно работать, см. docs.

Идея состоит в том, что данные сеанса хранятся внутри токена, так что вам вообще не нужен сеанс. Хранение его в памяти (как описано ниже) является только потерей памяти. Хранение его в cookie-клиентах также не очень хорошо, потому что клиент должен решить, где хранить токен, а не сервер.


Если вы просто хотите сохранить сессии express.js в памяти, и если вы используете стандартный сеанс expressjs для обработки сеансов, тогда вам нужно удалить строку store: new MongoStore(...):

app.use(expressSession({
    secret: 'arrete_x_paulette',
    saveUninitialized: true,
    resave: true,
    cookie: {
        secure: false,
        maxage: 6000000
    },
    proxy: false
}));

По умолчанию используется MemoryStore, см. документацию .

Ответ 2

@Boris Serebrov ответ в основном правильный. Вероятно, вы хотите установить {session: false}, чтобы сеансы не сохранялись в памяти на самом сервере, а также не сохраняли сеансы в базе данных. Но, вероятно, есть немного больше истории.

Одна из причин, почему люди используют хранилище постоянной памяти, состоит в том, что это означает, что при перезапуске сервера сеансы не теряются. Тем не менее, нам обещали аутентифицировать токены JWT на основе аутентификации. Итак, если он без гражданства, почему это имеет значение, если сервер перезагружается? Как только сервер будет загружен и запущен, тот же токен должен быть действительным, независимо от состояния сервера, правильно?

В моем кратком выступлении я обнаружил, что expressSession будет предоставлять сеансы, которые будут потеряны, если сервер перезагрузится. Это, вероятно, побудило людей использовать постоянные сеансы, используя Mongo и Redis, в первую очередь! Но вам не нужно это делать! Я не вижу причин использовать постоянные сеансы, хранящиеся в БД. Вы должны использовать JWT и authen authen... так что альтернатива, похоже, является cookieSession, еще одним модулем для Express.

Если вы используете cookieSession так:

app.use(cookieSession({
    name: 'some-cookie',
    keys: ['key1', 'key2']
}));

то даже если сервер перезагрузится, "сеанс" останется. Это работает с вашей текущей конфигурацией Passport, если вы удалите вызов для хранения сеансов в MongoStore и т.д.

https://github.com/expressjs/cookie-session

Пожалуйста, поправьте меня, если я ошибаюсь или что-то не замечаю.