Axios 授权不起作用 - VueJS + Django

Posted

技术标签:

【中文标题】Axios 授权不起作用 - VueJS + Django【英文标题】:Axios Authorization not working - VueJS + Django 【发布时间】:2020-07-22 12:27:04 【问题描述】:

我正在尝试使用 VueJS 和 Django 构建应用程序。我也在使用 Graphene-Django 库,因为该项目使用 GraphQL。

现在,身份验证工作正常,我得到了一个 JWT 令牌。 但是当我将令牌用于需要身份验证的其他查询时,我在 Vue 中遇到了这个错误:

"Error decoding signature"

Django 日志也返回这个:

graphql.error.located_error.GraphQLLocatedError: Error decoding signature

jwt.exceptions.DecodeError: Not enough segments

ValueError: not enough values to unpack (expected 2, got 1)

奇怪的是,在 Postman 中执行相同的查询却可以正常工作。

正如我在标题中提到的,我的请求使用 Axios,这里是一个请求示例:

axios(
  method: "POST",
  headers:  Authorization: "JWT " + localStorage.getItem("token") ,
  data: 
    query: `
        dailyAppoint (today: "$today") 
            id
            dateTime
        
     `
    
);

注意:它使用“JWT”而不是“Bearer”,因为不知何故“Bearer”对我不起作用。

【问题讨论】:

【参考方案1】:

好的,有几个问题,如果没有来自 curl 的 Vue.js,你的 API 是否可以工作。生成令牌,从 curl 检查 API。

如果是,则检查从请求发送的标头,来自 Network Inspector、mozilla dev tools/chrome devtools。并使用这些 RAW 标题更新您的帖子。

当您的公钥无法解码由您的私钥签名的字符串 [token] 时,会出现此特定错误。这最终意味着访问令牌已被篡改。这也可能意味着您正在发送诸如“未知”之类的值——JS 状态初始化错误。

检查请求的 RAW 标头。会有帮助的。

【讨论】:

我按照您的建议检查了 Chrome devtools,确实它正在发送:Authorization: JWT undefined您知道如何解决这个问题吗? 获得令牌后,是否将其放在本地存储中,如果有,请共享该代码。 我为我的请求添加了一个 Axios 拦截器。显然这是最好的做法,现在它可以工作了。【参考方案2】:

使用请求拦截器设置授权标头:

axios.interceptors.request.use(config => 
   if (localStorage.getItem("token") != null)
     config.headers["Authorization"] = "JWT " + localStorage.getItem("token");
   return config;
 );

【讨论】:

以上是关于Axios 授权不起作用 - VueJS + Django的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 护照、vueJS 和 Axios 中获得未经授权的 401

如何使用 axios 标头在 vuejs 中传递数据

在Laravel护照,vueJS和Axios中未经授权获得401

API 路由在 Laravel VueJS 应用程序中不起作用

使用标头参数的邮递员授权工作但不适用于 Axios 标头

带有 Laravel 5.4 后端的 Vuejs 2,发布(未经授权)错误