почему req.isAuthenticated () возвращает false, даже если сессия сохранила идентификатор пользователя? [Дубликат]

Для подсказок посмотрите на имя имени класса, которое выдает ошибку и номер строки, например: Ошибка компиляции [ERROR] \ applications \ xxxxx.java: [44,30] ошибка: не удается найти символ

Еще одна причина - неподдерживаемый метод для java-версии: jdk7 vs 8. Проверьте свой% JAVA_HOME%

33
задан CodyBugstein 18 March 2015 в 00:26
поделиться

9 ответов

У меня была аналогичная проблема. Возможно, это связано с промежуточным программным обеспечением экспресс-сессии, необходимым для паспорта. Исправлено с помощью промежуточных устройств в следующем порядке: (Экспресс 4)

var session = require('express-session');

// required for passport session
app.use(session({
  secret: 'secrettexthere',
  saveUninitialized: true,
  resave: true,
  // using store session on MongoDB using express-session + connect
  store: new MongoStore({
    url: config.urlMongo,
    collection: 'sessions'
  })
}));

// Init passport authentication 
app.use(passport.initialize());
// persistent login sessions 
app.use(passport.session());
40
ответ дан Nitin 18 August 2018 в 18:45
поделиться
  • 1
    Я также сталкиваюсь с той же проблемой ... но не в состоянии получить решение – Nodemon 23 December 2015 в 09:31
  • 2
    я уже сделал то, что вы сказали выше ... но все же столкнулся с проблемой – Nodemon 23 December 2015 в 09:32
  • 3
    моя проблема заключалась в том, что я называл «passport.use, serializeUser, deserializeUser», но я не звонил «app.use (passport.initialize ()); и 'app.use (passport.session ()); до этого – osmingo 21 March 2016 в 16:54
  • 4
    @ user2988146: Хороший улов, я сделал ту же ошибку, но теперь это работает! – Ben 31 March 2016 в 19:11
  • 5
    У меня такая же проблема, @ Нитин, ты спасешь мой день! почему порядок настолько важен, чтобы все испортить? – chiahao 5 July 2017 в 08:23

У меня была та же проблема, забыв добавить

request.login()

в

app.post('/login', 
    function(request, response, next) {
        console.log(request.session)
        passport.authenticate('login', 
        function(err, user, info) {
            if(!user){ response.send(info.message);}
            else{

                request.login(user, function(error) {
                    if (error) return next(error);
                    console.log("Request Login supossedly successful.");
                    return response.send('Login successful');
                });
                //response.send('Login successful');
            }

        })(request, response, next);
    }
);

. Надеюсь, это может помочь другим, которые оказались здесь той же самой причиной, что и я.

2
ответ дан Özgen Eren 18 August 2018 в 18:45
поделиться
  • 1
    В pass.authenticaticate пользователь приходит ложно, а информация - как отсутствующие учетные данные. вы можете знать ошибку. пожалуйста, напишите мой вопрос для объяснения stackoverflow.com/questions/42898027/… – charan tej 20 March 2017 в 08:54
  • 2
    @ OE1, Спасибо. Вы спасли меня. – Vikram 9 July 2017 в 12:38
  • 3
    Примечание. Паспорт.authenticate () middleware автоматически вызывает req.login (). Эта функция используется, прежде всего, при регистрации пользователей, в течение которых req.login () может быть вызван для автоматического входа в новый зарегистрированный пользователь. – Epirocks 13 September 2017 в 21:46

Это также может быть проблемой при вызове POST / GET вашего клиента. У меня была такая же проблема, но оказалось, что я должен был дать fetch (это то, что я использовал) вариант credentials:'include' следующим образом:

fetch('/...', {
  method: 'POST',
  headers: myHeaders,
  credentials: 'include',
  body: ...
  ...})

Причина в том, что fetch doesn 't поддерживать передачу файлов cookie, что необходимо в этом случае.

7
ответ дан Alex H 18 August 2018 в 18:45
поделиться

Если вы завершаете свои маршруты следующим образом:

module.exports = function(){

router.get('/',(req,res)=>{
 res.send('stuff');
  }

}

Вам необходимо передать «приложение и паспорт» на ваши маршруты следующим образом:

module.exports = function(app,passport){

//routes n stuff

}
0
ответ дан metal_jacke1 18 August 2018 в 18:45
поделиться

Я исправил эту проблему, установив мой passport.deserializeUser . Я использую mongo native, и поскольку большинство примеров используют Mongoose, я снова попал в ловушку _id.

Поэтому не забудьте сделать _id Mongo ObjectID при чтении пользователя в deserializeUser

passport.deserializeUser(function(user, done) {
    const collection = db.get().collection('users')
    const userId = new mongo.ObjectID(user);
    collection.findOne({_id : userId}, function(err, user) {
        if (err) done(err, null);
        done(null, user);
    });
});

Мой запрос не нашел пользователя, так как я не сделал идентификатор ObjectID, и никаких ошибок не было указано.

0
ответ дан Mikko 18 August 2018 в 18:45
поделиться

FOR NEWBIES

Я столкнулся с аналогичной проблемой, где моя функция isAuthenticated () вернет false. Я потерял много времени, надеюсь, что этот ответ сохранит ваши.

Some Общие проблемы, которые следует соблюдать,

  1. Порядок установки промежуточного ПО (экспресс-сеанс> pass.initialize> pass.session) (и пока вы это делаете, ПРОВЕРИТЕ СВОЙ СИНТАКС).
  2. Методы Serialize и Deserialize должны передать пользователя по запросу. (Для получения дополнительной информации я опубликовал ответ по этой ссылке .. Основы сеанса Passport (expressjs) - зачем нам сериализоваться и десериализоваться? ), если нет пользователя по запросу, то isAuthenticated вернет false .... и перенаправит на PATH, определенный ...... когда false .... И ... ОДИН РАЗ СНОВА ..... ПРОВЕРЬТЕ СВОЙ СИНТАКСИС .
  3. Функция getUserById или findById, определенная в модели (user.js), должна иметь функцию User.findById (а не функцию User.findOne Again CHECK YOUR .. WAIT FOR IT..SYNTAX). (эта функция будет загружать пользователя по запросу в каждый сеанс)
7
ответ дан P.V. THOMAS 18 August 2018 в 18:45
поделиться
  • 1
    Спасибо, приятель, я много искал, но не нашел никакого решения, наконец, вы дадите мне решение. – Syed Muhammad Asad 16 July 2018 в 18:46
  • 2
    Я использовал findOne () в findById (), и теперь я заменил его на find (), и он работает нормально. Почему возникла проблема с findOne () – Syed Muhammad Asad 16 July 2018 в 18:47

У меня также была такая же проблема, но @PVThomas дает мне решение, как здесь, в ответах. Моя проблема заключалась в методе findById() в deserialize(). Я использовал findOne() в findById(), а затем я заменил его на find(), и теперь req.isAuthenticated() работает нормально. Мое приложение не сохраняло req.session.passport.user, оно возвращалось undefined, а затем после замены findOne() на find() оно сохраняло идентификатор пользователя в req.session.passport.user.

0
ответ дан Syed Muhammad Asad 18 August 2018 в 18:45
поделиться

Моя проблема заключалась в том, что я установил cookie.secure в true, даже если данные не были превышены https.

app.use(require('express-session')({
    secret: process.env.sessionSecret,
    cookie: {
        maxAge: 1000 * 60 * 60 * 24 * 7 // 1 week
    },
    store: store,
    resave: false,
    saveUninitialized: false,
    cookie: { secure: false } // Remember to set this
}));

Не забудьте установить файлы cookie на false, если вы не используете https

cookie: { secure: false } // Set to false

Также, если вы считаете, что https не помните, чтобы доверять прокси

app.set('trust proxy', 1) // trust first proxy
1
ответ дан Thomas Lindauer 18 August 2018 в 18:45
поделиться

Использовать аутентификацию в приведенном ниже порядке, это будет работать так же, как паспорт хочет экспресс-сессии для isAuthenticated для работы

//======================================installation of utilities======================================//
var express =      require("express"),
app =              express(),
bodyParser =       require("body-parser"),
mongoose =         require("mongoose"),
Campsite =         require("./models/campsite"),
override =         require("method-override"),
Comments =         require("./models/comments"),
seedDB =           require("./seed"),
User   =           require("./models/user.js"),
passport =         require("passport"),
passportlocal =    require("passport-local"),
passportmongoose = require("passport-local-mongoose")

//======================================uitilities setup ==============================================//

app.use(override("_method"))
app.use(bodyParser.urlencoded({ extended: true }))
app.set("view engine","ejs")
seedDB()

app.use(require("express-session")({
    secret:"random text input",
    resave:false,
    saveUninitialized:false
}))
app.use(passport.initialize())
app.use(passport.session())
passport.use(new passportlocal(User.authenticate()))
passport.serializeUser(User.serializeUser())
passport.deserializeUser(User.deserializeUser())
mongoose.connect("mongodb://localhost/yelpCamp")
app.use(function(req, res, next){
   res.locals.currentUser = req.user;
   next();
});
0
ответ дан vishnu prasath 18 August 2018 в 18:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: