2017-08-29 4 views
0

私はLocal Strategyとpassport-local-mongooseでPassportJSを使用しています。私のログインスクリプトは、Passportログインを使用して401条件をキャッチできません

// Configure Passport (server.js) 
// --------------------------------------------------------------- 
passport.use(new LocalStrategy(User.authenticate())); 
passport.serializeUser(User.serializeUser()); 
passport.deserializeUser(User.deserializeUser()); 
// --------------------------------------------------------------- 

です。

// POST to /login (authenticate.js) 
// --------------------------------------------------------------- 
router.post('/login', (req, res) => { 
    // server-side validation 
    const errors = { 
    username: Validator.validateusername(req.body.username), 
    password: Validator.validatepassword(req.body.password), 
    }; 
    if (!isEmpty(errors)) return res.send(JSON.stringify({ error: errors })); 

    passport.authenticate('local')(req, res,() => { 
    // If logged in, we should have user info to send back 
    if (req.user) { 
     const userdata = JSON.stringify(req.user); 
     const token = jwt.sign({ 
     username: req.user.username, 
     firstName: req.user.firstName, 
     lastName: req.user.lastName, 
     email: req.user.email, 
     img: req.user.img, 
     }, process.env.JWT_SECRET); 
     res.cookie('token', token); 
     return res.send(userdata); 
    } 
    // Otherwise return an error 
    return res.send(JSON.stringify({ error: 'There was an error logging in' })); 
    }); 
}); 

これは、ログインエラーが発生した場合を除いて正常に動作します。何らかの理由(401または500)でログインが失敗した場合、このスクリプトはThere was an error logging inメッセージを返しませんか?代わりに、401 Unauthorizedが返されます。

この認証は、ルックアップするスキーマは次のとおりです。

const { mongoose } = require('../config/dbconfig'); 

const Schema = mongoose.Schema; 
const passportLocalMongoose = require('passport-local-mongoose'); 

const User = new Schema({ 
    username: { 
     type: String, 
     lowercase: true, 
     required: true, 
     unique: true, 
    }, 
    password: { 
     type: String, 
     select: false, 
     required: true, 
    }, 
    firstName: { 
     type: String, 
     required: true, 
    }, 
    lastName: { 
     type: String, 
     required: true, 
    }, 
    email: { 
     type: String, 
     lowercase: true, 
     required: true, 
     unique: true, 
    }, 
    img: { 
     type: String, 
    }, 
}, { timestamps: true }); 

User.plugin(passportLocalMongoose); 

module.exports = mongoose.model('User', User); 

答えて

1

あなたは少し間違った戦略を呼んでいます。ミドルウェアとして使用するか、custom callbackの方法を使用してください。あなたはミドルウェアのように戦略を呼びますが、独自のものを提供しますnext middleware function。認証はミドルウェアとして呼び出されますが、failureRedirectオプションは提供されないため、Passportはreturn 401 by defaultになります。 nextの機能はcalled when successfully authenticatedです。あなたの場合は、次のミドルウェアではなくコールバック機能です。

app.post('/login', (req, res, next) => { 
    // ... 
    passport.authenticate('local', (err, user, info) => { 
    if (err) { return next(err); } 
    if (user) { 
     // ... 
     req.login(user, (err) => { 
     if (err) { return next(err); } 
     return res.send(userdata); 
     }); 
    } else { 
     return res.status(401).send({ error: 'There was an error logging in' }); 
    } 
    })(req, res, next); 
}); 

は、あなたがこのようなルートハンドラを記述する必要がありますカスタムコールバックを使用するには
関連する問題