如何使用passport-local-mongoose进行异步身份验证调用?

问题描述

我有一个使用passport-local-mongoose 的工作实现,但想使用async/await 来保持一致,避免嵌套回调,并且对所有错误都被捕获和处理感到满意。

我已经整理了注册方法,但在其他方面卡住了。例如,我发现 req.login() 需要回调,所以我不能等待那个。

这是我的控制器:

const User = require('../models/User')
const { populateModel } = require('../helpers/modelHelper')
const responseHelper = require('../helpers/responseHelper')
const { body,validationResult } = require('express-validator')
const passport = require('passport')
const jwt = require('jsonwebtoken')
const JwtStrategy = require('passport-jwt').Strategy
const ExtractJwt = require('passport-jwt').ExtractJwt
const options = {
    jwtFromrequest: ExtractJwt.fromAuthHeaderAsBearerToken(),secretorKey: process.env.AUTH_SECRET
}

// register working as expected async
module.exports.register = async (req,res,next) => {

    const user = new User(),fillable = [
            'title','firstName','lastName','practice','addressLine1','addressLine2','city','state','postcode','jobTitle','country','locale','userRole','termsAccepted','consentOptIn','username','password','legacyUserId','authType'
        ]

    populateModel(user,fillable,req.body)

    try {

        const result = await User.register(user,req.body.password)

        return responseHelper.handleSuccess(res,{
            user: result
        })

    } catch(err) {
        next(err)
    }

}

// login - would like to conver to async
module.exports.login = [

    body('username','Email is required').not().isEmpty().isEmail(),body('password','Password is required').not().isEmpty(),(req,res) => {

        const errors = validationResult(req)

        if ( ! errors.isEmpty()) return responseHelper.handleValidationError(res,errors)

        passport.authenticate('local',{},(err,user,info) => {

            if (err) return responseHelper.handleOperationError(res,err)
            if ( ! user) return responseHelper.handleAuthError(res,'Username/password not matched.')

            req.logIn(user,(err) => {

                if (err) return responseHelper.handleAuthError(res,err)

                const token = jwt.sign({ _id: user._id },process.env.AUTH_SECRET,{ expiresIn: 1800 })

                return res.json({
                    message: "Authentication successful.",user: user,token: token
                })

            })

        })(req,res)

    }

]

// token strategy - would like to conver to async
passport.use(new JwtStrategy(options,(payload,callback) => {

    User.findById(payload,user) => {

        if (err) return callback(err,false)
        if (user) return callback(null,user)
        return callback(null,false)

    })

}))

// get user - would like to conver to async
module.exports.user = [

    (req,next) => {

        passport.authenticate('jwt',{ session: false },user) => {

            if (err) return responseHelper.handleOperationError(res,'User not authenticated.')

            return res.json({
                message: "Authentication successful.",user: user
            })

        })(req,next)

     }

]

在我的应用程序文件中,我使用的是passport-local-mongoose 的认值:

passport.use(User.createStrategy())
passport.serializeUser(User.serializeUser())
passport.deserializeUser(User.deserializeUser())

任何我的路由器调用我的控制器:

router.post('/auth/register',authController.register)
router.post('/auth/login',authController.login)
router.get('/auth/user',authController.user)

最后,我有一个错误处理程序设置为中间件和一个用于响应的帮助模块:

app.use((err,req,next) => responseHelper.handleUnexpectedError(res,err))
module.exports.handleSuccess = (res,data) => {

  return res.json({
    message: 'Success.',data: data
  })

}

module.exports.handleUnexpectedError = (res,err) => {

  const validationErrors = [
      'ValidationError','UserExistsError','MissingUsernameError','MissingPasswordError'
  ]

  let code = err.status || 500

  if (code === 500 && err.name && validationErrors.includes(err.name)) code = 422
  
  return res.status(code).json({
    message: err.message || 'Internal Server Error.',error: err
  })

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)