我正在使用护照验证对我的快速API的调用。我有一个非常标准的设置:
/* Passport Setup */
const jwtOptions = {
jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('Bearer'),
secretOrKey: config.auth.passport.key,
}
passport.use(
'jwt',
new JWT.Strategy(jwtOptions, (payload, done) => {
console.log('Using JWT Strategy')
User.findOne({ email: payload.email }, (err, user) => {
if (err) {
return done(err, false)
}
if (user) {
done(null, user)
} else {
done(null, false)
}
})
}),
)
/* Middleware */
const checkToken = passport.authenticate('jwt', { session: false })
const logAuthInfo = (req, res, next) => {
console.log(req.headers)
console.log(req.user)
}
/* Routes */
app.use(passport.initialize())
app.use('/graphql', checkToken, logAuthInfo, graphqlHTTP(graphQLConfig))
// other REST routes, including login
我的登录路由返回JWT,当使用此令牌向/graphql
发出请求时,一切正常。但是,未经身份验证的请求(没有令牌)会返回401.我想要做的就是在所有请求中使用checkToken
中间件,将req.user
分配给其中一个经过身份验证的用户数据或false
。然后,我会在其他地方处理任何授权。
当我没有令牌发出请求时,我没有看到“使用JWT策略”日志到控制台,因此中间件甚至没有运行。
有什么想法吗?
答案 0 :(得分:1)
好的,我在发布此消息后不久就想到了这一点。对于带着相同问题来到这里的任何人 - 解决方案不是使用passport-jwt
来实现此目的,而是使用基础jsonwebtoken
。
我的工作中间件现在看起来像:
const jwt = require('jsonwebtoken')
const PassportJwt = require('passport-jwt')
const getUserFromToken = (req, res, next) => {
const token = PassportJwt.ExtractJwt.fromAuthHeaderWithScheme('Bearer')(req)
jwt.verify(token, jwtSecret, (err, decoded) => {
if (err) {
req.user = false
next()
return
}
req.user = decoded
next()
})
}
app.use(getUserFromToken)
app.use('/graphql', graphqlHTTP(graphQLConfig))
// Elsewhere, in my GraphQL resolvers
const userQuery = (obj, args, request, info) => {
// ^^^^^^^
// I've also seen this parameter referred to as 'context'
console.log(request.user) // either 'false' or the serialized user data
if (req.user) {
// do things that this user is allowed to do...
} else {
// user is not logged in, do some limited things..
}
}