Аутентифицированный запрос на паспорт местного ожидающего - PullRequest
0 голосов
/ 29 января 2020

Я разрабатываю приложение для аутентификации, используя Node, MongDB, Passport, Express и React. Я пытаюсь решить эту проблему 2 дня, но все еще застреваю. Ошибка происходит после отправки данных на сервер, сервер не обрабатывает этот запрос. Вот моя конфигурация:

Паспорт Локальная конфигурация

  const LocalStrategy = require('passport-local').Strategy
  passport.use({
    usernameField: 'username',
    passwordField: 'password'
  }, new LocalStrategy((username, password, done) => {
    /*Match username or not*/
    User.findOne({ email: username }, (err, user) => {
      if (err) {
        console.log(`Error: ${err}`)
        return done(err)
      }
      /* user not found */
      if (!user) {
        console.log(`User not matched!`)
        return done(null, false, {
          message: 'That email is not registered'
        })
      }
      /*Match password*/
      bcrypt.compare(password, user.password, (err, isMatch) => {
        if (err) throw err
        if (isMatch) {
          return done(null, user)
        } else {
          return done(null, false, {
            message: 'Password incorrect'
          })
        }
      })
    })
  }))

Аутентификационный маршрутизатор

router.post('/auth/local/login', (req, res, next) => {
  console.log(`Login info: ${JSON.stringify(req.body)}`)
  passport.authenticate('local', {
    successRedirect: "/dashboard",
    failureRedirect: "/login",
    failureFlash: false
  })
})

Клиент Сторона

  formData.append('username', username)
  formData.append('password', password)
  const data = new URLSearchParams(formData)
  fetch('/auth/local/login', {
    method: 'POST',
    body: data
  })
    .then(res => res.json())
    .then(json => {
      console.log(`${JSON.stringify(json)}`)
      handleAuthenticated(json)
    })
    .catch(err => console.log(err))

Журнал на стороне сервера

Server started successfully at 3001!
Database connected successfully!
Login info: {"username":"newemail@yahoo.com","password":"123456"}

Проверка браузером

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Я исправил эту проблему. По сути, мы просто обрабатываем аутентификацию внутри функции обратного вызова passport.authenticate ('local'), как показано ниже:

router.post('/auth/local/login', (req, res, next) => {
   passport.authenticate('local', {
     session: false
    }, (err, user, info) => {
      if(err || !user) return res.status(401).json({
         auth: false,
         msg: "Authentication failed",
         token: null
      }) 
      req.login(user, {session: false}, err => {
         if(err) res.send(err)
      })
      const token = jwt.sign(user.id, key.tokenSecret)
      return res.status(200).json({
        auth: true,
        msg: "Login successfully",
        token: token
      })
   })(req, res)
})

** Для сеанса установлено значение false, поскольку мы не хотим сохранять пользователя в сеансе .

И теперь работает отлично. На стороне клиента, в зависимости от ответа, который мы получаем от сервера, мы перенаправляем пользователя на нужную страницу. Я проверил оба: успех и провал

enter image description here

0 голосов
/ 29 января 2020

Проблема в том, что вы не используете правильный метод подписи passport.use. Правильный вот этот:

passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'passwd'
  },
  function(username, password, done) {
    // ...
  }

, а не этот:

passport.use({
    usernameField: 'username',
    passwordField: 'password'
  }, new LocalStrategy((username, password, done) => {
  ...
}}
...