Req.user возвращает undefined после аутентификации

Я работаю над экспресс-сервером, который использует стратегии паспорта-локального и google-oauth2 с сеансом cookie для аутентификации. Стратегия google-oauth отлично работает на 100% без проблем. Но моя локальная стратегия возвращает req.user undefined ... а req.session возвращает паспорт, за которым следует пустой объект. Это сразу после успешного перехода по маршруту successRedirect !? Как будто пользователь мгновенно выходит из системы ...

Я использовал несколько console.infos, чтобы попытаться как можно лучше следить за ходом стратегии, но не нашел критической точки (найдите прикрепленную ссылку на изображение журналов терминала). журналы терминала img

код следует ...

сервер / index.js

import 'babel-polyfill'
import express from 'express'
import mongoose from 'mongoose'
import cookieSession from 'cookie-session'
import passport from 'passport'
import bodyParser from 'body-parser'

// Import User model / making schema globaly available
import './models/User'

// Import Routes
import userRoutes from './routes/api/user'
import localAuthRoutes from './routes/auth/local'
import googleAuthRoutes from './routes/auth/google'

// Import Strategies
import './services/passportGoogle'
import './services/passportLocal'

// Config Keys
import keys from './config/keys'

mongoose.Promise = global.Promise  

// Connect to Mongodb
mongoose
  .connect(
    keys.mongoURI,
    { useMongoClient: true }
  )
  .then(() => console.info('MongoDB wired up'))
  .catch(err => console.info(err))

// Run Express
const app = express()

// Middleware
app.use(bodyParser.json())

// Passport config
app.use(
  cookieSession({
    name: 'session',
    maxAge: 30 * 24 * 60 * 60 * 1000,
    keys: [keys.cookieKey]
  })
)
app.use(passport.initialize())
app.use(passport.session())

// Use Routes
userRoutes(app)
localAuthRoutes(app)
googleAuthRoutes(app)

app.listen(5000, () => {
  console.info('Server monitoring port 5000')
})

сервер / маршруты / аутентификация / local.js

import mongoose from 'mongoose'
import passport from 'passport'
import gravatar from 'gravatar'

import keys from '../../config/keys'
import validateRegisterInput from '../../validation/register'
import validateLoginInput from '../../validation/login'

// Import User Model
const User = mongoose.model('User')

module.exports = app => {
  // @route  POST auth/register
  // @desc   Register user with email and password
  // @access Public
  app.post('/auth/register', (req, res) => {
    const { errors, isValid } = validateRegisterInput(req.body)
    //Check Validation
    if (!isValid) {
      return res.status(400).json(errors)
    }
    // Check if User exists
    User.findOne({ email: req.body.email }).then(user => {
      if (user) {
        errors.email = 'Email alresdy in use'
        return res.status(400).json(errors)
      } else {
        const avatar = gravatar.url(req.body.email, {
          s: '200', // Size
          r: 'pg', // Rating
          d: 'mm' // Default
        })

        const newUser = new User({
          email: req.body.email,
          name: req.body.name,
          avatar,
          password: req.body.password
        })
        newUser
          .save()
          .then(user => res.json(user))
          .catch(err => console.info(err))
      }
    })
  })

  // @route  POST /auth/login
  // @desc   User Login with Eamil and Password
  // @access public
  app.post(
    '/auth/login',
    passport.authenticate('local', {
      successRedirect: '/api/success',
      failureRedirect: '/api/failed'
    })
  )
}

сервер / услуги / паспортLocal.js

import passport from 'passport'
import mongoose from 'mongoose'
import { Strategy as LocalStrategy } from 'passport-local'

const User = mongoose.model('User')

passport.serializeUser((user, done) => {
  // mongoID not googleID
  console.info('reached serializeUser!')
  done(null, user.id)
})

passport.deserializeUser((id, done) => {
  // mongoID not googleID
  User.findById(id).then(user => {
    console.info('reached deserializeUser!')
    done(null, user)
  })
})

passport.use(
  new LocalStrategy(
    {
      usernameField: 'email'
    },
    async (email, password, done) => {
      const user = await User.findOne({ email: email })
      console.info('reached LocalStrategy!')

      if (!user || !user.validPassword(password)) {
        return done(null, false)
      } else {
        return done(null, user)
      }
    }
  )
)

Не удалось разобраться с этой проблемой, которая длится два дня ... Любой совет был бы потрясающим!

проверьте значение user и user.validPassword (пароль)

Raj Kumar 14.10.2018 22:05

Привет, Радж, спасибо за быстрый ответ и извинения за поздний ответ! Пользователь возвращает сведения о существующих пользователях, сохраненные в базе данных. user.validPassword (пароль) возвращает true.

Nico_R 16.10.2018 06:35

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

Raj Kumar 16.10.2018 21:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
751
1

Ответы 1

Я нашел решение ...! Мне не хватало промежуточного программного обеспечения с кодировкой url, которое требовалось для чтения пар входных ключей и значений из Postman.

Добавлено: app.use (bodyParser.urlencoded ({extended: false})) в мой корневой файл index.js, и теперь все работает :)

Другие вопросы по теме