2016-06-21 3 views
0

最初の妥当性確認ミドルウェアなしで身体の妥当性検査とエラー処理が必要です。コードはうまく動作しますが、最初のミドルウェアを削除し、2番目のミドルウェアで検証を管理したいと思います。身体の妥当性検査とエラー処理を伴うPassport.jsローカルログイン

{ 
    "error": "Invalid email and/or password" 
} 

と私はこれをしたいと思います:ユーザーが一致しない場合は、エラー処理については

ルートは/

router.post('/signin', function(req, res, next){ 

    req.checkBody('email', 'Email is required.').notEmpty(); 
    req.checkBody('email', 'Invalid email format.').isEmail(); 
    req.checkBody('password', 'Password is required.').notEmpty(); 
    req.checkBody('password', 'The password length must be between 8 and 100.').isLength({min: 8, max: 100}); 

    var err = req.validationErrors(); 
    if (err) { 
     res.status(400).send({ success: false, error: err}); 
     return; 
    } 
    next(); 
}); 

router.post('/signin', passport.authenticate('local', { session: false }), function(req, res){ 
    var user = req.user; 
    return res.json({success: true, user: user}); 
}); 

をauth.js、エラーがある

{ 
    "success":false, 
    "error": "Invalid email and/or password" 
} 

どうすればいいですか?

passport.jsの返信用

passport.use(new LocalStrategy({ 
     usernameField: 'email', 
     passwordField: 'password' 
    }, 
    function(email, password, done) { 
     User.findOne({ email: email, password: password },'-password', function (err, user) { 
      if (err)return done(err); 
      if(!user){ 
       var err = new Error('Invalid email and/or password'); 
       err.status = 401; 
       return done(err, false); 
      } 

      return done(null, user); 
     }) 
    } 
)); 

感謝。

答えて

2

あなたが正しく理解している場合は、LocalStrategyオブジェクトの検証機能で検証が行われるようにしてください。

これを行うには、先にreqオブジェクトにアクセスする必要があります。そのためには、戦略のpassReqToCallbackオプションを有効にする必要があります。

passport.use(new LocalStrategy({ 
     usernameField  : 'email', 
     passwordField  : 'password', 
     passReqToCallback : true 
    }, 
    function(req, email, password, done) { ... }); 

そこから、あなたが最初のミドルウェアと同じ検証コードを使用することができます。

function(req, email, password, done) { 
    req.checkBody('email', 'Email is required.').notEmpty(); 
    req.checkBody('email', 'Invalid email format.').isEmail(); 
    req.checkBody('password', 'Password is required.').notEmpty(); 
    req.checkBody('password', 'The password length must be between 8 and 100.').isLength({min: 8, max: 100}); 

    var err = req.validationErrors(); 
    if (err) { 
     return done(err, false, { success: false, error: err}); 
    } 
    User.findOne({...}); 
}); 

そして最後に、あなたがする必要があります

router.post('/signin', function(req, res, next) { 
    passport.authenticate('local', { session : false }, function(err, user, info) { 
    if (err) return next(err); 
    if (! user) { 
     return res.status(400).json(info); 
    } 
    return res.json({ success : true, user : req.user}); 
    })(req, res, next); 
}); 

コールバックへのinfo引数が目にマップ:検証結果を処理するためにpassport.authenticate()のカスタムコールバックを使用します検証ハンドラのdone()コールバックのird引数。注意すべき

ことの一つは、リクエストボディ内emailpasswordが空の場合はパスポートがnotEmpty検証は議論の余地が作るこれ、ローカル戦略ハンドラを呼び出すことではないだろうということです。

関連する問題