NodeJS JWT护照-未经授权

hts6caw3  于 2022-12-29  发布在  Node.js
关注(0)|答案(8)|浏览(200)

我有一个问题,它总是返回未经授权的我。当我设置头授权的令牌收到。它返回与。
未经授权

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

    });

}));
hgtggwj0

hgtggwj01#

你必须改变这些事情:
1)您必须将jwtFromRequest: ExtractJwt.fromAuthHeader(),更改为jwtFromRequest :ExtractJwt.fromAuthHeaderAsBearerToken(),
2)设置标题:Authorization:Bearer {token}
3)将jwt_payload._id更改为jwt_payload._doc._id

kulphzqa

kulphzqa2#

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

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

htrmnn0y3#

你可能在request header中出错了,按照README应该是'Authorization' = 'bearer token_received_on_login'

ql3eal8s

ql3eal8s4#

只需进行一项更改,使用jwt_payload._doc.id代替jwt_payload.id

jum4pzuy

jum4pzuy5#

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

  1. jwt_payload.data._id对我很有效
z9gpfhce

z9gpfhce6#

VS代码服务器挂起这将发生,因为在您的代码中的一些错误。它不是特定于任何常见的代码更改。它可以是任何小的代码错误所做的你。在我的情况下,我使用

app.use(express.json)

代替

app.use(express.json())
xzlaal3s

xzlaal3s7#

在我的例子中,不是使用相同的秘密值来签名和提取jwt。在为两个场景设置相同的秘密值后,身份验证就像一个魅力。
当使用jsonwebtokennpm包创建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
        })

提取护照内的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
        }
    });
}));
nfeuvbwi

nfeuvbwi8#

在我的例子中:是算法

const options = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: PUB_KEY,
  algorithms: ['RS256']
};

我删除了“算法:['RS256']”而且它成功了(在2个小时内解决了这个问题,感觉有点无聊)

相关问题