如何解决如何使用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 举报,一经查实,本站将立刻删除。