尽管在 header 中设置了有效的 JWT,但来自 axios 的 Post Request 总是返回 Unauthorized / Axios Deletes Headers

Posted

技术标签:

【中文标题】尽管在 header 中设置了有效的 JWT,但来自 axios 的 Post Request 总是返回 Unauthorized / Axios Deletes Headers【英文标题】:Post Request from axios always returns Unauthorized despite having valid JWT set in header/Axios Deletes Headers 【发布时间】:2021-10-28 20:09:34 【问题描述】:

我设置了passport-local来登录一个用户,然后一旦登录,用户就会通过passport-JWT获得一个JWT token。 JWTStrategy 设置为使用 jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken() 以便 JWT 可以使用 Authorization 标头 Authorization: `Token $userContext.token` 发送。在我的反应客户端中,我使用 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 请求和后端的快速路由中发布时,请求总是以401 Unauthorized 响应。

但是,当我从 POSTMAN 发送相同的请求时,使用未经授权的请求中使用的相同承载令牌,请求成功且没有任何错误。

TLDR:GET 请求使用 JWT 令牌并返回 200 状态码,而使用 POST 方法的相同请求返回 401 状态码。

我在这里错过了什么??!

【问题讨论】:

【参考方案1】:

您可能在那里使用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 方法。

希望这对您有所帮助。

【讨论】:

感谢您的回复。我在服务器上设置了一个 get 和一个 post 路由来处理每种类型的请求。所以这不是问题。【参考方案2】:

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

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

我觉得自己被骗了,因为我花了很多时间在这上面,但解决方案实在是太让人失望了。 Axios 一直在欺骗我:/

【讨论】:

以上是关于尽管在 header 中设置了有效的 JWT,但来自 axios 的 Post Request 总是返回 Unauthorized / Axios Deletes Headers的主要内容,如果未能解决你的问题,请参考以下文章

在每个 API 请求中传递 JWT 令牌

尽管在 matplotlib 中设置了不可见轴,但 eps 图像中的幻轴

如何在 JWT Header 中设置 JWT 类型

tsc compile in React (create-react-app) 需要显式编译标志,尽管我在 tsconfig.json 中设置了它们

Cookie中设置了"HttpOnly"属性,有效的防止XSS攻击

如何正确处理标头中的 JWT