Post 来自 axios 的请求总是 returns 尽管在 header/Axios 中设置了有效的 JWT 但未授权删除 Headers
Post Request from axios always returns Unauthorized despite having valid JWT set in header/Axios Deletes Headers
我设置了 passport-local 来登录用户,然后一旦登录,用户将通过 passport-JWT 获得一个 JWT 令牌。 JWTStrategy 设置为使用
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()
以便 JWT 可以使用授权 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}`}
}
此请求成功验证并 returns 来自 /me 的用户数据。
现在问题来了:当我使用完全相同的请求结构,但在 axios 请求和后端的快速路由中将方法切换为 post 时,请求总是以 [= 响应18=].
然而,当我从 POSTMAN 发送相同的请求时,在未经授权的请求中使用相同的 Bearer Token,请求成功,没有任何错误。
TLDR:GET 请求使用 JWT 令牌,return 使用 200 状态代码,而使用 POST 方法的同一请求 return 使用 401 状态代码。
我在这里错过了什么??!
您可能在那里使用 GET
而不是在任何地方使用 POST
。
在您的代码中,您只有 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 方法也是为了那个。
希望这对您有所帮助。
我找到了解决这个问题的办法。出于某种原因,axios 没有维护我在配置变量中设置的授权 header,并在发出请求时将其删除。为了解决这个问题,我只需要重新调整我的 axios 请求,使其看起来像这样:
const res = await axios({
method:'POST',
url:"http://localhost:8080/users/test",
headers:{'Authorization':`Bearer${token}`
}})
我感觉被骗了,因为我花了很多时间在这上面,而且解决方案是如此平庸。 Axios 一直在逗我:/
我设置了 passport-local 来登录用户,然后一旦登录,用户将通过 passport-JWT 获得一个 JWT 令牌。 JWTStrategy 设置为使用
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()
以便 JWT 可以使用授权 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}`}
}
此请求成功验证并 returns 来自 /me 的用户数据。
现在问题来了:当我使用完全相同的请求结构,但在 axios 请求和后端的快速路由中将方法切换为 post 时,请求总是以 [= 响应18=].
然而,当我从 POSTMAN 发送相同的请求时,在未经授权的请求中使用相同的 Bearer Token,请求成功,没有任何错误。
TLDR:GET 请求使用 JWT 令牌,return 使用 200 状态代码,而使用 POST 方法的同一请求 return 使用 401 状态代码。
我在这里错过了什么??!
您可能在那里使用 GET
而不是在任何地方使用 POST
。
在您的代码中,您只有 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 方法也是为了那个。
希望这对您有所帮助。
我找到了解决这个问题的办法。出于某种原因,axios 没有维护我在配置变量中设置的授权 header,并在发出请求时将其删除。为了解决这个问题,我只需要重新调整我的 axios 请求,使其看起来像这样:
const res = await axios({
method:'POST',
url:"http://localhost:8080/users/test",
headers:{'Authorization':`Bearer${token}`
}})
我感觉被骗了,因为我花了很多时间在这上面,而且解决方案是如此平庸。 Axios 一直在逗我:/