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 的代码,如果你有 patchdeleteput 的条件,你将不得不编写 axios 方法也是为了那个。

希望这对您有所帮助。

我找到了解决这个问题的办法。出于某种原因,axios 没有维护我在配置变量中设置的授权 header,并在发出请求时将其删除。为了解决这个问题,我只需要重新调整我的 axios 请求,使其看起来像这样:

const res = await axios({
    method:'POST',
    url:"http://localhost:8080/users/test",
    headers:{'Authorization':`Bearer${token}`
  
  }})

我感觉被骗了,因为我花了很多时间在这上面,而且解决方案是如此平庸。 Axios 一直在逗我:/