Паспорт выдает ошибку «Не удалось сериализовать пользователя в сеанс», хотя сеансы отключены в локальной стратегии - PullRequest
0 голосов
/ 17 января 2019

Я использую паспорт для обработки аутентификации для конечной точки API и поэтому не хочу использовать сеансы. Я использую локальную стратегию для аутентификации, и мой код выглядит так:

const express = require('express');
const bodyParser = require('body-parser');
const passport = require('passport')
    , LocalStrategy = require('passport-local').Strategy;

const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(passport.initialize());

passport.use(new LocalStrategy({ session: false }, function(username, password, done){

    // hardcoded login data for demonstration
    if (username === 'dummy-user' && password === '123456seven'){
        return done(null, { username: 'dummy-user' });
    } else {
        return done(null, false, { message: 'incorrect username or password' });
    }
}));

app.post('/login', passport.authenticate('local'), function(req, res){
    res.send(req.user);
});

app.listen(3000, function () {
    console.log("App is listening on port 3000.");
});

Я отключил сеансы для своей стратегии, как описано в документах passport-local: https://github.com/jaredhanson/passport-local

Когда я пытаюсь войти в систему через http-запрос, я получаю следующую ошибку:

Error: Failed to serialize user into session
    at pass (/Users/johannes/Documents/StackOverflow/passportQ/node_modules/passport/lib/authenticator.js:281:19)
    at Authenticator.serializeUser (/Users/johannes/Documents/StackOverflow/passportQ/node_modules/passport/lib/authenticator.js:299:5)
    at SessionManager.logIn (/Users/johannes/Documents/StackOverflow/passportQ/node_modules/passport/lib/sessionmanager.js:14:8)
    at IncomingMessage.req.login.req.logIn (/Users/johannes/Documents/StackOverflow/passportQ/node_modules/passport/lib/http/request.js:50:33)
    at Strategy.strategy.success (/Users/johannes/Documents/StackOverflow/passportQ/node_modules/passport/lib/middleware/authenticate.js:248:13)
    at verified (/Users/johannes/Documents/StackOverflow/passportQ/node_modules/passport-local/lib/strategy.js:83:10)
    at Strategy._verify (/Users/johannes/Documents/StackOverflow/passportQ/index.js:14:16)
    at Strategy.authenticate (/Users/johannes/Documents/StackOverflow/passportQ/node_modules/passport-local/lib/strategy.js:90:12)
    at attempt (/Users/johannes/Documents/StackOverflow/passportQ/node_modules/passport/lib/middleware/authenticate.js:361:16)
    at authenticate (/Users/johannes/Documents/StackOverflow/passportQ/node_modules/passport/lib/middleware/authenticate.js:362:7)

Мне удалось избавиться от этой ошибки, изменив

app.post('/login', passport.authenticate('local'), ...

до

app.post('/login', passport.authenticate('local', { session: false }), ...

Мои вопросы:

  1. Почему сеансы не отключаются должным образом, когда я передаю соответствующую опцию экземпляру LocalStrategy?
  2. Есть ли способ отключить сеансы для стратегии, чтобы мне не приходилось передавать эту опцию для каждого запроса аутентификации в моем коде API? Если это возможно, я бы хотел добиться этого без использования макетов для функций serializeUser и deserializeUser.
  3. Если нет, то имеет ли значение, установлена ​​опция для стратегии или нет?

Для отправки http-запроса я использовал следующую команду:

curl -d "username=dummy-user&password=123456seven" -X POST "http://localhost:3000/login"

...