问题描述
我正在使用axios从Django
前端调用React
后端api。
对于该登录API,我在逻辑上使用Django Knox包。
React.js -我正在调用axios.request(method,url,data)
,并且api调用正常工作。
当我去Developer tools
> Network
时,我可以在请求标头中看到Referer
标头设置为React.js网站,而没有其他与csrf相关的标头。在Response标头中,我可以看到两个set-cookie
标头csrftoken
和sessionid.
React Native -我调用api的方式相同,但api返回错误csrf Failed referer checking Failed - no referer
。当我检查response.config
时,没有设置Referer
头,这与React.js不同
卷曲-效果很好
httpie -工作正常
如何摆脱这个错误。
注释1 -我的Django后端基于api令牌逻辑,而不以任何方式都不是csrf。
注释2 -React.js和Django托管在不同的域中。我在处于调试模式的React Native中遇到错误。
更新1 -在Django settings.py中禁用CSRF中间件后,现在我只得到一个setCookie标头(不再获得csrftoken),但仍然存在相同的错误。
解决方法
Django Rest API需要一个Referer标头。
对于React.js,它是自动设置的(可能是通过浏览器设置的),其值为当前网站。
但是在React Native的情况下,它没有设置。所以我们必须手动设置它。
- 从此link,我在axios中设置Referer标头。参见下面的代码
export const axiosAPICall = (method,url,data,headers) => {
let request = {
method: method,url: url,};
if (data) {
request['data'] = data;
}
if (headers) {
request['headers'] = headers;
}
// Referer is auto-set in react.js as same website value.
// for react-native we have to set it manually to target api:port
request['headers'] = {
...request['headers'],Referer: url
}
return axios.request(request)
.then(res => res.data)
.catch(error => {throw error});
};
- 在Django
settings.py
中,我评论了CSRF middleware
- 在Django
settings.py
中,我仅添加了TokenAuthentication
类以删除SessionAuthentication
。
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',]
}
注意-请正确了解您的要求后,执行步骤2和3,后果自负。我删除了CSRF中间件,因为我的API完全依赖于令牌进行身份验证。我根本不需要CSRF。