Passport JWT - 未经授权

时间:2016-09-05 13:55:32

标签: node.js express jwt passport.js

我遇到了一个问题,即它总是对我未经授权。当我将标题授权设置为收到的令牌时。它返回。

  

未经授权

router.get('/dashboard', passport.authenticate('jwt', {session: false}), (req, res) => {

    res.json('It worked: User ID is: ' + req.user._id);

});

var jwtOptions = {

    jwtFromRequest: ExtractJwt.fromAuthHeader(),
    secretOrKey: config.jwt.secretOrKey
    //issuer: config.jwt.issuer,
    //audience: config.jwt.audience,
};

passport.use(new JWTStrategy(jwtOptions, (jwt_payload, done) => {

    User.findOne({id: jwt_payload.id}, (err, user) => {

        if (err) {
            return done(err, false);
        }

        if (!user) {
            return done(null, false);
        }

        return done(null, user);

    });

}));

6 个答案:

答案 0 :(得分:9)

你必须改变这些事情:

1)你必须改变    jwtFromRequest:ExtractJwt.fromAuthHeader(),到jwtFromRequest:ExtractJwt.fromAuthHeaderAsBearerToken(),

2)设置标题:     授权:Bearer {token}

3)jwt_payload._id更改为jwt_payload._doc._id

答案 1 :(得分:2)

我遇到了同样的问题!下面的代码对我有用。

module.exports = function(passport) {
    passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
        User.findById(jwt_payload._id, function(err, user) {
            if (err) {
                return done(err, false);
            }
            if (user) {
                done(null, user);
            } else {
                done(null, false);
            }
        });
    }));
};

问题在于User.findOne({id: jwt_payload.id}, ...

同时,在将标记附加到标题时,请使用& cnd"在这种格式的AJAX调用中:

$.ajax({
        url:  url,
        type: 'POST',
        data: data,
        beforeSend: function(xhr) {
          xhr.setRequestHeader('Authorization', window.localStorage.getItem('token'));
        },
        success: function(data) {
          console.log(data);
        },
        error: console.log("Error");
});

答案 2 :(得分:2)

您可能必须在请求标头中出错。 根据{{​​3}},它应该是'Authorization'='bearer token_received_on_login'

答案 3 :(得分:0)

只需要进行一项更改,请使用jwt_payload._doc.id而不是jwt_payload.id

答案 4 :(得分:0)

  1. 将标头从res.json({token: 'JWT ' + token})设置为res.json({token: 'Bearer ' + token})

  2. jwt_payload.data._id为我工作

答案 5 :(得分:0)

VS代码服务器挂起,这是由于代码中的某些错误而发生的。 它不特定于任何常见的代码更改。 可能是您犯的任何小代码错误。 就我而言 我正在使用

app.use(express.json)

代替

app.use(express.json())