如果顺序错误,护照将无法通过一系列策略进行身份验证

时间:2018-10-22 10:02:30

标签: node.js facebook express passport.js google-authentication

所以我接下来有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)

这是问题所在

注意password.authenticate()中的数组。如果我这样保留,facebook策略在google之前,当使用google令牌进行身份验证时,它总是会失败,因为在执行google策略之前,facebook已经失败了,并且我从facebookstrategy得到了错误。

如果我交换数组中的位置,并且像['jwt','google','facebook']一样,则可以使用。

因此,我假设authenticate方法按顺序运行,而不是并行运行。根据护照文件,我读到如果所有策略都失败,它将返回失败。但是在第一种情况下(fb在Google的前端)不会失败,但是facebook阻止了执行下一个策略?

我该如何解决这个问题,所以facebook策略不会阻止其他人?还是我在这里做错了什么?

0 个答案:

没有答案