【问题标题】:Get user, but do not return 401 with Express Passport + JWT middleware获取用户,但不使用 Express Passport + JWT 中间件返回 401
【发布时间】:2018-07-10 06:49:27
【问题描述】:

我正在使用护照验证对我的 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。我想做的不同是在 all 请求上使用 checkToken 中间件,将 req.user 分配给经过身份验证的用户数据或false。然后我会在其他地方处理任何授权。

当我在没有令牌的情况下发出请求时,我看不到控制台中的“使用 JWT 策略”日志,因此中间件甚至没有运行。

有什么想法吗?

【问题讨论】:

    标签: javascript express jwt passport.js


    【解决方案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..
           } 
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-06
      • 2021-10-11
      • 2020-08-28
      • 2021-05-14
      • 2017-08-22
      • 1970-01-01
      • 2018-02-07
      • 2019-07-01
      • 2017-11-12
      相关资源
      最近更新 更多