【问题标题】:Passport JWT - UnauthorizedPassport JWT - 未经授权
【发布时间】:2017-01-12 22:02:06
【问题描述】:

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

未经授权

.

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);

    });

}));

【问题讨论】:

  • 确保您使用相同的SecretKey 来签署令牌和验证传入令牌,并确保您将令牌过期时间保持足够长,以便它不会很快过期你的测试。

标签: node.js express jwt passport.js


【解决方案1】:

你必须改变这些事情:

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

2) 设置标题: Authorization:Bearer {token}

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

【讨论】:

  • 这对我有用,除了第三步只需要你签署令牌的内容(在我的情况下是用户名)
  • Set the header: Authorization:Bearer {token} 为我工作。
  • 第三点可能会根据 passportpassport-jwt 的版本而改变。您应该始终使用console.log(jwt_payload) 检查内容。在某些情况下(passport 0.4.0 和 passport-jwt 4.0.0),您应该使用 jwt_payload.payload._id
【解决方案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}, ...

在将令牌附加到标头时,在 AJAX 调用中以这种格式使用“beforeSend”:

$.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");
});

【讨论】:

    【解决方案3】:

    您可能在request header 中犯了一个错误。 根据README,应该是'Authorization' = 'bearer token_received_on_login'

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:
        1. 将标头从res.json({token: 'JWT ' + token}) 设置为res.json({token: 'Bearer ' + token})

        2. jwt_payload.data._id 为我工作

        【讨论】:

          【解决方案6】:

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

          app.use(express.json)
          

          而不是

          app.use(express.json())
          

          【讨论】:

            猜你喜欢
            • 2018-02-02
            • 2018-11-05
            • 1970-01-01
            • 2020-01-28
            • 1970-01-01
            • 2018-03-18
            • 2018-06-06
            • 2021-09-21
            • 2021-06-08
            相关资源
            最近更新 更多