我设置passport-local来登录用户,一旦登录,将通过passport-JWT为用户提供一个JWT令牌。JWTStrategy被设置为使用jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()
,以便JWT可以与Authorization header Authorization: `Token ${userContext.token}`}
一起发送。在我的react客户端,我使用axios设置了一个GET
请求,如下所示:
const fetchProfileDetails = async(config)=>{
const res = await axios.get("http://localhost:8080/users/me", config)
}
const config = {
method:"GET",
withCredentials: true,
headers: {Authorization: `Bearer ${userContext.token}`}
}
此请求成功通过身份验证并从/me返回用户数据。
现在重点来了:当我使用完全相同的请求结构,但在axios请求和后端的express路由中将方法切换为post时,请求总是以401 Unauthorized
作为响应。
但是,当我从POSTMAN发送相同的请求时,使用未经授权的请求中使用的相同的持有者令牌,请求成功,没有任何错误。
TLDR: GET请求使用JWT令牌并返回200状态代码,而使用POST方法的相同请求返回401状态代码。
我错过了什么??!
发布于 2021-08-30 18:41:50
我想出了一个解决这个问题的办法。由于某些原因,axios没有维护我在配置变量中设置的Authorization头,并在发出请求时将其删除。为了解决这个问题,我只需要重新调整我的axios请求,使其看起来像这样:
const res = await axios({
method:'POST',
url:"http://localhost:8080/users/test",
headers:{'Authorization':`Bearer${token}`
}})
我觉得自己被骗了,因为我花了大量的时间在这上面,而解决方案却如此平淡无奇。Axios一直在骗我:/
发布于 2021-08-30 05:53:03
您可能正在使用那里的GET
,而不是使用POST
anywhere。在您的代码中,只有get
的代码。您还需要为post
编写代码。下面是post
的代码,供您参考:
router.post('/', config, async(req, res, next) => {
const { error } = validateBody(req.body);
if (error) {
return res.status(400).send(error.details[0].message);
}
const newData= new passport({ name: req.body.name });
await newData.save();
console.log('saving the document');
res.send(newData);
})
你的代码也应该有post
。编写单一的代码是行不通的。你需要为每种情况和每种可能性编写代码。因此,就像get
也需要post
代码一样,如果你有patch
、delete
或put
的条件,你也必须为它编写axios方法。
希望这对你有任何帮助。
https://stackoverflow.com/questions/68977915
复制相似问题