【问题标题】:req.user returns undefined after authenticationreq.user 认证后返回 undefined
【发布时间】:2019-03-19 06:43:48
【问题描述】:

我正在开发一个快速后端,它使用本地护照和 google-oauth2 策略以及 cookie-session 进行身份验证。 google-oauth 策略 100% 运行良好,没有任何问题。但是我的本地策略返回 req.user undefined... 并且 req.session 返回护照后跟一个空对象。这直接在成功进入successRedirect路由之后!?就好像用户立即登出一样......

我使用了一些 console.logs 来尝试尽可能地遵循策略的流程,但没有找到断点(找到附加的终端日志图像的链接)。 terminal logs 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.log('MongoDB wired up'))
  .catch(err => console.log(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.log('Server monitoring port 5000')
})

服务器/路由/auth/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.log(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'
    })
  )
}

服务器/服务/passportLocal.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.log('reached serializeUser!')
  done(null, user.id)
})

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

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

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

现在两天没有解决这个问题......任何建议都会很棒!

【问题讨论】:

  • 检查user和user.validPassword(password)的值是什么
  • 您好 Raj,感谢您的快速回复并为迟到的回复道歉!用户返回保存在数据库中的现有用户详细信息。 user.validPassword(password) 返回 true。
  • 对不起,想不出解决办法。您能否尝试一个使用最少代码和包的新项目并检查它是否有效?通过这种方式,您可以缩小问题范围并更接近解决方案。

标签: node.js express passport.js cookie-session


【解决方案1】:

我找到了解决方案...! 我缺少从 Postman 读取输入键和值对所需的 url 编码中间件。

已将 app.use(bodyParser.urlencoded({ extended: false })) 添加到我的根 index.js 文件中,现在一切正常:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-14
    • 2022-10-30
    • 1970-01-01
    • 2020-11-18
    • 2019-04-28
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多