Итак, у меня есть следующие 3 стратегии, использующие с паспортом:
const FacebookTokenStrategy = require('passport-facebook-token');
const GoogleTokenStrategy = require('passport-google-id-token');
passport.use('jwt', new JWTStrategy({
jwtFromRequest: ExtractJWT.fromAuthHeaderWithScheme('JWT'),
secretOrKey: config.passport.secret
}, async (jwtPayload, cb) => {
try {
return cb(null, jwtPayload);
} catch (err) {
console.error('ERROR IZ JWT STRATEGIJE', err)
return cb(err, false);
}
}))
passport.use('google', new GoogleTokenStrategy({
clientID: [config.passport.google.ios]
}, async (parsedToken, googleId, cb) => {
try {
console.log({ parsedToken, googleId })
return cb(null, parsedToken)
} catch (err) {
console.error('ERROR IZ GOOGLE STRATEGIJE', err)
return cb(err, false)
}
}))
passport.use('facebook', new FacebookTokenStrategy({
clientID: config.passport.facebook.clientID,
clientSecret: config.passport.facebook.clientSecret,
fbGraphVersion: 'v3.0'
}, async (accessToken, refreshToken, profile, cb) => {
try {
console.log({ accessToken })
return cb(null, profile)
} catch (err) {
console.error('ERROR IZ FB STRATEGIJE', err)
return cb(err, false);
}
}))
И у меня есть следующая функция промежуточного программного обеспечения:
isLoggedIn: (req, res, next) => passport.authenticate(['jwt', 'facebook', 'google' ], { session: false }, (err, user, info) => {
if (err) return res.status(401).json({ error: { message: 'Unauthorized', err } })
if (!user) return res.status(401).send('Unauthorized')
req.login(user, { session: false }, (err) => {
if (err) return next(err)
return next()
})
})(req, res, next)
Это проблема:
Обратите внимание на массив в passport.authenticate ().Если я оставляю это так, стратегия Facebook перед Google, при авторизации с помощью токена Google всегда происходит сбой, потому что перед выполнением стратегии Google уже произошел сбой Facebook, и я получаю сообщение об ошибке из стратегии Facebook.
Если я поменяю местами в массиве и сделаю как ['jwt', 'google', 'facebook'], это работает.
Итак, я предполагаю, что метод authenticate выполняется по порядку, а не parralel.По паспортной документации я прочитал, что если все стратегии потерпели неудачу, она вернется неудачноНо в первом случае (где fb находится напротив Google), он не потерпит неудачу, а facebook блокирует выполнение следующей стратегии?
Как я могу решить эту проблему, чтобы стратегия Facebook не блокировала других?Или я здесь что-то не так делаю?