[英]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 小時內解決這個問題感覺有點笨拙)
將頭從res.json({token: 'JWT ' + token})
為res.json({token: 'Bearer ' + token})
jwt_payload.data._id
為我工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.