2

我正在尝试使用 Express 和 MongoDB 设置 Passport。目前我可以在数据库中注册用户。但是每当我尝试登录时,我都会收到一条错误消息,指出需要数据和哈希参数。现在我有这样的 Server.js 文件

const mongoose = require('mongoose');
const User = require('./models/users')

     const initializePassport = require('./passport-config')
      initializePassport(
        passport,
        email => User.find({email: email}),
        id => User.find({id: id})
      )


      app.post('/register', checkNotAuthenticated, async (req, res) => {
        try {
          const hashedPassword = await bcrypt.hash(req.body.password, 10)
          const newUser = new User({
            id: Date.now().toString(),
            name: req.body.name,
            email: req.body.email,
            password: hashedPassword
          })
          res.redirect('/login')
          console.log(newUser)
        } catch {
          res.redirect('/register')
        }

    And my Passport-Config.js file like this `

    const LocalStrategy = require('passport-local').Strategy
    const bcrypt = require('bcrypt');
    const User = require('./models/users')

    function initialize(passport, getUserByEmail, getUserById) {
      const authenticateUser = async (email, password, done) => {
        const user = getUserByEmail(email)
        if (user === null) {
          return done(null, false, { message: 'No user with that email' })

        }

        try {
          if (await bcrypt.compare(password, user.password)) {
            return done(null, user)
          } else {
            return done(null, false, { message: 'Password incorrect' })
          }
        } catch (e) {
          return done(e)
        }
      }

      passport.use(new LocalStrategy({ usernameField: 'email' }, authenticateUser))
      passport.serializeUser((user, done) => done(null, user.id))
      passport.deserializeUser((id, done) => {
        return done(null, User.findById({user: id}))
      })
    }

    `
4

1 回答 1

0

我已经使用 console.log() 语句进行了一些调查(并不为此感到自豪),但我认为我已经设法找出问题所在。如果我们在这里添加第一个控制台日志语句:

  app.post('/register', checkNotAuthenticated, async (req, res) => {
    try {
      console.log("BCRYPT COMPARE RUNS HERE")
      const hashedPassword = await bcrypt.hash(req.body.password, 10)
      const newUser = new User({
        id: Date.now().toString(),
        name: req.body.name,
        email: req.body.email,
        password: hashedPassword
      })
      res.redirect('/login')
      console.log(newUser)
    } catch {
      res.redirect('/register')
    }

第二个在这里:

 const initializePassport = require('./passport-config')
  initializePassport(
    passport,
    email => User.find({email: email}).then((result) => { console.log("USER DATA EXTRACTED HERE") }).catch((err) => { console.log(err) }),
    id => User.find({id: id})
  )

下次单击登录时,您应该会看到如下输出:

Listening on port 3000
BCRYPT COMPARE HAPPENING
Error: data and hash arguments required
...
...
...
USER DATA EXTRACTED HERE

请注意,在我们真正能够从数据库中获取用户信息之前,bcrypt.compare 正在运行?这意味着该函数的所有参数都是空的,这就是返回该错误的原因。现在,我不是 JS 专家,但这可以通过在此处添加 await 语句来解决:

   function initialize(passport, getUserByEmail, getUserById) {
      const authenticateUser = async (email, password, done) => {
        const user = await getUserByEmail(email)
        if (user === null) {
          return done(null, false, { message: 'No user with that email' })

        }

这确保在脚本中移动之前从数据库中查询用户信息。

于 2021-04-22T13:00:04.050 回答