护照本地策略未被调用

时间:2017-05-21 15:21:12

标签: node.js express passport.js

我目前正在使用vue& amp;表达

我采用护照作为认证库,我已多次使用它。

所以我知道当我发出登录请求时,护照中间件通过“xx策略”对用户进行身份验证。

问题是注册请求运行良好但登录不是

我经常弄错了' for response.data。

我甚至无法猜出假的来源。

没有返回false的返回语句。

以下是我的代码。

passport.deserializeUser((authId, done) => {
  let hasUser
  let users = User.findOneByAuthId(authId)
  .then(results => (hasUser = results.length))

  if (hasUser) {
    console.log('deserialize!')
    done(null, users[0])
  } else {
    console.log('no user')
    done(null, { message: 'no user' })
  }
})

passport.use(new LocalStrategy(
  (username, password, done) => {
    let hasUser
    let users = User.findOneByEmail(username)
    .then(results => (hasUser = results.length))

    if (hasUser) {
      let user = users[0]
      let { hash } = user

      if (User.checkPassword(password, hash)) {
        done(null, { message: 'success' })
      } else {
        done(null, { message: 'wrong password' })
      }
    } else {
      done(null, { message: 'wrong email' })
    }
  }
))

router.post('/register', (req, res) => {
  if (!fun.emailChecker(req.body.username)) {
    return res.status(403).json({
      message: 'Invalid Email'
    })
  }

  if (!fun.passwordChecker(req.body.password)) {
    return res.status(403).json({
      message: 'Invalid Password'
    })
  }

  let hasUser
  User.findOneByEmail(req.body.username)
  .then(results => (hasUser = results.length))

  if (hasUser) {
    return res.status(409).json({
      message: 'Email Exist'
    })
  } else {
    let user = {
      authId: 'local: ' + req.body.username,
      email: req.body.username,
      hash: User.hashPassword(req.body.password),
      displayName: req.body.displayName
    }

    User.create(user)
    .then(results => {
      if (!results) {
        throw new Error('user creation error')
      } else {
        req.login(user, err => {
          if (!err) {
            req.session.save(() => {
              return res.json({ success: true })
            })
          }
        })
      }
    })
  }
})

router.post('/login', (req, res) => {
  passport.authenticate('local', (err, result) => {
    if (!err) {
      return res.json(result)
    }
  })(req, res)
})

// vue component
methods: {
onSubmit () {
  axios.post('http://localhost:3001/auth/login', {
    email: this.email,
    password: this.password
  }).then(response => console.log(response.data))
},

1 个答案:

答案 0 :(得分:0)

您的代码存在各种问题。

从错误的承诺处理开始:

let hasUser
let users = User.findOneByAuthId(authId)
.then(results => (hasUser = results.length))

if (hasUser) { ... }

您正尝试在此处使异步代码同步。必须将依赖于异步查询结果的代码移动到内部 then处理程序(deserializeUser和策略验证处理程序中):

User.findOneByAuthId(authId).then(users => {
  let hasUser = users.length;

  if (hasUser) {
    console.log('deserialize!')
    done(null, users[0]);
  } else {
    console.log('no user')
    done(Error('no user'));
  }
});

(我不太确定为什么你的方法findOneByAuthId,其名称暗示最多只有一个结果,可能会产生一个数组)

此外,您没有使用正确的约定将用户数据和登录错误传回Passport:

if (User.checkPassword(password, hash)) {
  done(null, { message: 'success' })
} else {
  done(null, { message: 'wrong password' })
}

这应该是这样的(很明显,其他地方done被错误地调用也应该修复):

if (User.checkPassword(password, hash)) {
  done(null, user);
} else {
  done(null, false, { message: 'wrong password' })
}

"验证回调"

下记录here

最后,您错误地使用passport.authenticate(),这可能是返回false的原因。相反,试试这个:

router.post('/login', passport.authenticate('local'), (req, res) => {
  return res.json(req.user); // or whatever you want to return in case of login success
})

(记录here;如果您想使用自定义回调,请在该页面上查找"自定义回调"