护照 JWT - 未经授权

8
我遇到了一个问题,每次都会返回未授权。当我将头部的Authorization设置为接收到的令牌时,它会返回以下内容:

未授权


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

    });

}));

1
请确保在签署令牌和验证传入令牌时使用相同的“SecretKey”,并确保令牌过期时间足够长,以便在测试之前不会很快过期。 - Rahul Gupta
8个回答

14

你需要更改以下内容:

1) 你需要将 jwtFromRequest: ExtractJwt.fromAuthHeader() 改为 jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()

2) 设置头部信息:Authorization:Bearer {token}

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


1
这对我有用,除了第三步只需要使用您签署令牌的内容(在我的情况下是用户名)。 - Dara Java
1
设置头部: Authorization:Bearer {token} 对我有效。 - lzl124631x
第三点可能会根据 passportpassport-jwt 的版本而改变。您应该始终使用 console.log(jwt_payload) 检查内容。在某些情况下(passport 0.4.0 和 passport-jwt 4.0.0),您应该使用 jwt_payload.payload._id - Francis Ngueukam

4

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

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

2
您可能在请求头中犯了一个错误。根据README的说明,应该是'Authorization' = 'bearer token_received_on_login'

0
  1. res.json({token: 'JWT ' + token}) 中的头部设置为 res.json({token: 'Bearer ' + token})

  2. jwt_payload.data._id 对我有用


0

只需要一个更改,使用jwt_payload._doc.id代替jwt_payload.id


0
在我的情况下,问题出在签署和提取jwt时没有使用相同的密钥值。将相同的密钥值设置到两种情况中后,身份验证就可以完美地工作了。
在使用jsonwebtoken npm包创建jwt时。
const token = jwt.sign(payload, process.env.SECRET, { expiresIn: "1d" })
        return res.status(200).send({
            success: true,
            message: "Logged in successfully!",
            token: "Bearer " + token
        })

在 Passport 中提取 jwt 时

const opts = {
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
    secretOrKey: process.env.SECRET
};

passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
    console.log("jwt_payload", jwt_payload)
    UserModel.findOne({ id: jwt_payload.id }, function(err, user) {
        if (err) {
            return done(err, false);
        }
        if (user) {
            return done(null, user);
        } else {
            return done(null, false);
            // or you could create a new account
        }
    });
}));

0
在我的情况下: 这是算法的问题。
const options = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: PUB_KEY,
  algorithms: ['RS256']
};

我移除了 "algorithms: ['RS256']",然后它就可以工作了(感觉自己有点傻,花了2个小时才解决)


0

VS Code 服务器挂起,这通常是因为您代码中存在一些错误造成的。 这并不特定于任何常见的代码更改。 它可能是由您犯下的任何小的代码错误引起的。 在我的情况下, 我正在使用

app.use(express.json)

替代

app.use(express.json())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接