簡體   English   中英

護照 JWT - 未經授權

[英]Passport JWT - Unauthorized

我遇到了一個問題,它總是未經授權返回給我。 當我將 header 授權設置為收到的令牌時。 它返回。

未經授權

.

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)您必須將jwtFromRequest: ExtractJwt.fromAuthHeader(),更改為jwtFromRequest :ExtractJwt.fromAuthHeaderAsBearerToken(),

2)設置頭部: Authorization:Bearer {token}

3) jwt_payload._id改為jwt_payload._doc._id

我遇到了同樣的問題! 下面的代碼對我有用。

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

您可能在request header犯了錯誤。 根據自述文件,它應該是'Authorization' = 'bearer token_received_on_login'

只需要進行一項更改,使用jwt_payload._doc.id而不是jwt_payload.id

VS 代碼服務器掛斷這會發生,因為您的代碼中存在一些錯誤。 它不特定於任何常見的代碼更改。 它可能是您犯的任何小代碼錯誤。 就我而言,我正在使用

app.use(express.json)

而不是

app.use(express.json())

在我的例子中,沒有使用相同的秘密值來簽名和提取 jwt。在為兩種情況設置相同的秘密值后,身份驗證就像一個魅力。

使用 jsonwebtoken 創建 jwt 時 npm package

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

就我而言:這是算法

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

我刪除了“算法:['RS256']”並且它起作用了(在 2 小時內解決這個問題感覺有點笨拙)

  1. 將頭從res.json({token: 'JWT ' + token})res.json({token: 'Bearer ' + token})

  2. jwt_payload.data._id為我工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM