2016-05-02 2 views
3

Я использую Passport, чтобы разрешить пользователям вход в систему через Google. Сессия хранится в Postgres. Мне кажется, что я правильно настроил все эти вещи. Однако isAuthenticated() возвращает несогласованные значения.Passport.js `isAuthenticated()` непоследовательное поведение; false, когда это должно быть правдой

Несоответствие происходит при успешном завершении аутентификации. Я настроил паспорт для перенаправления /success, когда пользователь успешно вошли в систему.

Если сервер только что загрузил (это означает, что никто не пытался протоколирование в еще), то isAuthenticated() возвращается true для /success конечной точки.

Как только пользователь выйдет из системы, если они заходят в систему, то isAuthenticated() возвращает false по маршруту /success. Если они обновляют страницу, то она возвращает true.

Конечная точка /logout также действует непоследовательно. Иногда он работает в первый раз, в то время как в другое время пользователь должен обновляться.

Я рассматривал подобные проблемы, с которыми сталкиваются люди. В частности, две наиболее распространенные проблемы, как представляется, не тот случай:

  1. CORS установлен (SO answer/my code)
  2. порядок моего промежуточного слоя кажется правильным (SO answer/my code)
  3. logIn не имеет значения, так как я не ставил пользовательский обратный вызов (SO Answer)
  4. Сериализация правильной работы; это просто не вызывался в определенных ситуациях (SO question/explanation in here; session isn't finding su)

За последние несколько часов, я шагая через исходный код паспорта, чтобы попытаться выяснить это. Более подробную информацию о том, что я нашел, можно прочитать здесь on the Passport repo.

Проект, в котором это происходит, является открытым исходным кодом. Промежуточное конфигурируется здесь:

https://github.com/jmeas/finance-app/blob/google-sign-in/server/app.js

и конфигурация паспорта можно увидеть здесь:

https://github.com/jmeas/finance-app/blob/google-sign-in/server/utils/configure-passport.js

Может быть, я что-то очевидное отсутствует?

ответ

2

tl; dr - это то, что вам нужно вручную вызывать сохранение в определенных браузерах (например, в Chrome). Они не будут ждать полного ответа перед перенаправлением.

Более подробно см:

https://github.com/expressjs/session/issues/309#issuecomment-230594298

и связанные вопросы. Я хорошо разбираюсь в этом.

+0

Я рекомендую вам вывести код из github и вставить его в ответ здесь, в stackoverflow.Это уменьшит дополнительный щелчок, необходимый для решения этой проблемы. – Phil

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