Javascript 获取用户,但不要返回401和Express Passport+;JWT中间件

Javascript 获取用户,但不要返回401和Express Passport+;JWT中间件,javascript,express,jwt,passport.js,Javascript,Express,Jwt,Passport.js,我正在使用passport验证对express API的调用。我有一个非常标准的设置: /* Passport Setup */ const jwtOptions = { jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('Bearer'), secretOrKey: config.auth.passport.key, } passport.use( 'jwt', new JWT.Strategy(jwtO

我正在使用passport验证对express 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策略”日志,因此中间件甚至没有运行


有什么想法吗?

好的,我在发布这篇文章后很快就想到了。对于任何带着同样问题来到这里的人——解决方案不是使用
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..
       } 
}