我怎样才能获得饼干在'Axios.interceptors.request`的config`

2019-09-30 19:40发布

我怎样才能获得饼干csrftokenAxios.interceptors.request小号配置”?

Axios.interceptors.request.use(
  config => {

    if (
      config.method === "post" ||
      config.method === "put" ||
      config.method === "delete"||
      config.method === "get"
    ) {

    }


    if (Cookies.get('token')!==undefined) {   
      config.headers['Authorization']= 'Token '+Cookies.get('token');
    }
    // there I try to get the `csrftoken` in the Cookies, but I can not get.
    if (Cookies.get('csrftoken')!==undefined) {   

      config.headers['x-csrftoken']= Cookies.get('csrftoken');  // 'CSRFToken'
    }

    return config;
  },
  error => {  
    return Promise.reject(error.data.error.message);
  }
);

Axios.interceptors.request的配置我不能让饼干的csrftokenCookies.get('csrftoken')

我AxiosConfig代码为波纹管:

AxiosConfig:{
    baseURL: 'http://10.10.10.105:8001/',

    responseType: "json",
    withCredentials: true,  // there will send the Cookie (with it there are: sessionid, csrftoken)

    xsrfCookieName: 'csrftoken',  // default: XSRF-TOKEN
    xsrfHeaderName: 'x-csrftoken',   // default: X-XSRF-TOKEN
    headers: {
      "Content-Type": "application/json;charset=utf-8"
    }
  }

编辑-1

还有就是csrftoken在Cookie。


编辑-2

而在cookie中,没有csrftoken了。


编辑-3

如果我得到document.cookie控制台,我将获得"" :```

的document.cookie
< “”```


编辑-4

在我的Django的后端,在settings.py

INSTALLED_APPS:

...
'corsheaders', 

'rest_framework',
'rest_framework.authtoken',
'rest_framework_docs',   
'rest_auth',
'allauth',
'allauth.account',
'allauth.socialaccount',
'rest_auth.registration',
...

我不知道是否该rest_authallauth会影响csrftoken

Answer 1:

首先,始终确保cookie不会标记为仅Http 。

如果是,你javascript代码将无法读取/修改其内容。

你可以在浏览器中查看饼干标签,你会看到它是否是可读与否。

在你的情况虽然, django不应该设置标志作为httpOnly的文档描述了如何读取值javascript直接从cookie。

有几件事情,我可以通过经验指出:

  • 配置对象可能还没有被充满,当你收到它的拦截器内的数据。 因此,在设置config.headers = ...; 可能会引发错误。

请确保你写的:

config.headers = config.headers || {}; 

设置前headers所以没有“config.headers未定义”将被触发。

  • 可替换地,直接读取该cookie,存储csrf值的隐藏内部input作为每默认程序。

你可以做这样的事情(语法可能是不正确的):

<input type="hidden"
   name="csrftoken"
   value="{% csrf_token %}"/>
</div>

然后用拦截器内发送令牌:

config.headers['x-csrftoken'] = document.querySelector('input[name="csrftoken"]').value;

在这种情况下,因为你并不需要读取cookie,这将是一个巨大的加分将其设置为httpOnly



文章来源: How can I get the Cookies' `csrftoken` in `Axios.interceptors.request`'s config?