所以我接下来有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策略不会阻止其他人?还是我在这里做错了什么?