[英]Prorogate a custom error in PassportJS
我正在嘗試重構現有的應用程序,以增加對PassportJS的支持,但是它比預期的要困難得多。
我正在使用passport-jwt作為策略。 所以我有
passport.use(new JwtStrategy(options, user.verify));
router.post(
'/login/jwt',
passport.authenticate('jwt', {session: false, failWithError: true})
);
並且如果user.verify失敗,它將調用(例如)
done(new Error(errors.BAD_REQUEST));
但是我沒有辦法處理此錯誤,無論我作為完成回調的第一個參數傳遞什么,Passport始終會發送401-未經授權的響應。
這不是我期望的,因為我的代碼庫中有許多錯誤處理程序,並且我想向客戶端傳達有意義的錯誤。
到目前為止,我在Google上搜索了很多東西,除了官方文檔外,我還提出了幾個SO問題,但是這些解決方案都可以解決我的問題。
例如,針對此問題的常見解決方案是使用閉包來訪問req和res對象(如上面的鏈接),但這不適用於我現有的應用程序。
有人能幫我嗎?
因此,我假設您想幫助用戶,例如說密碼不正確。
在“驗證回調”部分中,您可以找到以下示例:
return done(null, false, { message: 'Incorrect password.' });
默認情況下,如果身份驗證失敗,Passport將以401未經授權狀態響應
要捕獲此消息,您可以嘗試執行以下操作: http : //passportjs.org/docs#custom-callback
app.get('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
})(req, res, next);
});
這有幫助嗎?
編輯:沒有IIFE
app.post('/login',
passport.authenticate('local', { failWithError: true }),
function(req, res, next) {
// Handle success
return res.send({ success: true, message: 'Logged in' })
},
function(err, req, res, next) {
// Handle error
return res.status(401).send({ success: false, message: err })
}
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.