Проверка подлинности паспорта с использованием множества стратегий завершается неудачно, если в неправильном порядке - PullRequest
0 голосов
/ 22 октября 2018

Итак, у меня есть следующие 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 не блокировала других?Или я здесь что-то не так делаю?

...