未经授权和错误请求的 Passport.js 自定义错误

Mr *_*bot 3 error-handling node.js express jwt passport.js

passport-jwt如果用户为假(电子邮件|密码为空`)并且如果用户未注册,则已实现并尝试抛出自定义错误响应

api.js

const passport = require('passport');
const router = require('express-promise-router')();

const passportHelper = require('../helpers/passportHelper');
const authController = require('../controllers/authController');
const { badRequest } = require('../helpers/responseHelper');

const requireAuth = passport.authenticate('jwt', { session: false });
const requireSignin = passport.authenticate('local', { session: false }, (err, user, info) => {
    if(!user) {
        const err = new Error('please provide email and password.');
            err.status = 400;
            err.code = 'CP_SI_ValidationFailed';
            return err;
    }
});

router.post('/signup', authController.signup);
router.post('/signin', requireSignin, authController.signin);

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

当我尝试与邮递员登录时,我没有收到任何回复

预期结果

{
    "error": {
        "code": "CP_SI_ValidationFailed",
        "message": "email and password is required"
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有其他方法来处理 badRequest 并返回上面的响应,

谢谢你

Cal*_*lor 5

这是一个确实返回响应的更新答案。

const requireSignin = (req, res, next) => {
  passport.authenticate('local', { session: false }, (err, user, info) => {
    if (err || !user) {
      const err = {};
      err.status = 400;
      err.code = 'CP_SI_ValidationFailed';

      return res.json(err); // send the error response to client
    }
    return next(); // continue to next middleware if no error.

  })(req, res, next); /* passport.authentication returns a function,
                         we invoke it with normal req..res arguments 
                         to override default functionality */ 
}
Run Code Online (Sandbox Code Playgroud)


d_s*_*hiv 2

从 Passport.authenticate 回调返回错误是不够的。返回值不由护照处理。如果你想向客户端返回自定义错误,你应该编写一个自定义中间件。如果您将requireSignin方法更改为如下所示,它应该按预期工作:

const requireSignin = function(req, res, next) {
    passport.authenticate('local', { session: false }, (err, user, info) => {
        if(err || !user) {
            const err = {};
            err.status = 400;
            err.code = 'CP_SI_ValidationFailed';

            return res.json(err); // send the error response to client
        } 
        return next(); // continue to next middleware if no error.
    })(req, res, next);
});
Run Code Online (Sandbox Code Playgroud)