如何使用 React Relay 处理 CSRF 令牌
How to handle CSRF tokens with React Relay
我正忙于开发一个 React Native 应用程序,它与 Django 服务器上的 GraphQL api 对话。
在 React Native 中,我正在使用 React Relay 尝试处理我的 GraphQL 请求(按照找到的指南 here),但我的请求遇到 403 问题。
回复说 CSRF token missing or incorrect
,我正在尝试找出实现此功能的最佳方法。
我知道我需要先获得一个 CSRF cookie 令牌,然后以某种方式将其与我的 GraphQL Post 请求一起传递,但运气不佳。
我目前的实现如下...
fetch('http://' + ip + ':8000/sign-in/')
.then((response) => {
const cookieHeader = response.headers.map["set-cookie"]; // This gets me a cookie response with a CSRF token
fetch('http://' + ip + ':8000/graphql', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Cookie': cookieHeader, // Try and pass the received cookie to my POST
'XSRF-TOKEN': cookieHeader // Trying this as well
},
body: JSON.stringify({
query: operation.text,
variables,
}),
}).then(response => {
console.log('RESPONSE', response) // Currently getting a 403
return response.json()
})
})
但这仍然让我出现 403 错误。
我似乎找不到更多关于如何处理这个问题的信息。任何人都可以告诉我哪里出错了,或者关于如何解决这个问题的一些建议吗?
(下面是我的 API 请求的快照)
所以设法让它与以下项目一起工作...
return getCsrfToken().then(csrfToken => {
if (csrfToken == null) {
console.log('CSRF NOT SET')
}
const url = 'http://' + ip + '/graphql'
return fetch(url, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-CSRFToken': csrfToken
},
body: JSON.stringify({
query: operation.text,
variables,
}),
})
.then(response => {
return response.json()
})
.catch(error => {
console.log('POST ERROR', error)
})
});
function getCsrfToken() {
var url = 'http://' + ip + '/graphql';
return CookieManager.get(url).then(response => {
return response.csrftoken;
});
}
添加这个是因为这是我发现的使用 Relay for Django + GraphQL 解决 CSRF 问题的最具体的问题
即使我发布了 CSRF 令牌,我也收到了类似的 CSRF 错误响应。我必须添加到 fetch headers 以匹配我的 Django 后端的安全设置。在这种情况下,我在浏览器中进行中继,因此我从 cookie 中获取 CSRF 令牌。
我已经关注了 CSRF with AJAX in cookies 的 Django 文档。由于我的安全设置,我必须添加“same-origin”凭据。我将标记我必须从中继快速入门教程中更改的几件事
import { get as getCookie} from 'browser-cookies'
return fetch('/graphql/', { // Added the trailing slash here
method: 'POST',
credentials: "same-origin", // Added this line
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': getCookie('csrftoken'), // getting token from cookies
},
body: JSON.stringify({
query: operation.text,
variables,
}),
}).then(response => {
return response.json();
});
这就是为我修复它的原因。
我正忙于开发一个 React Native 应用程序,它与 Django 服务器上的 GraphQL api 对话。
在 React Native 中,我正在使用 React Relay 尝试处理我的 GraphQL 请求(按照找到的指南 here),但我的请求遇到 403 问题。
回复说 CSRF token missing or incorrect
,我正在尝试找出实现此功能的最佳方法。
我知道我需要先获得一个 CSRF cookie 令牌,然后以某种方式将其与我的 GraphQL Post 请求一起传递,但运气不佳。 我目前的实现如下...
fetch('http://' + ip + ':8000/sign-in/')
.then((response) => {
const cookieHeader = response.headers.map["set-cookie"]; // This gets me a cookie response with a CSRF token
fetch('http://' + ip + ':8000/graphql', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Cookie': cookieHeader, // Try and pass the received cookie to my POST
'XSRF-TOKEN': cookieHeader // Trying this as well
},
body: JSON.stringify({
query: operation.text,
variables,
}),
}).then(response => {
console.log('RESPONSE', response) // Currently getting a 403
return response.json()
})
})
但这仍然让我出现 403 错误。
我似乎找不到更多关于如何处理这个问题的信息。任何人都可以告诉我哪里出错了,或者关于如何解决这个问题的一些建议吗?
(下面是我的 API 请求的快照)
所以设法让它与以下项目一起工作...
return getCsrfToken().then(csrfToken => {
if (csrfToken == null) {
console.log('CSRF NOT SET')
}
const url = 'http://' + ip + '/graphql'
return fetch(url, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-CSRFToken': csrfToken
},
body: JSON.stringify({
query: operation.text,
variables,
}),
})
.then(response => {
return response.json()
})
.catch(error => {
console.log('POST ERROR', error)
})
});
function getCsrfToken() {
var url = 'http://' + ip + '/graphql';
return CookieManager.get(url).then(response => {
return response.csrftoken;
});
}
添加这个是因为这是我发现的使用 Relay for Django + GraphQL 解决 CSRF 问题的最具体的问题
即使我发布了 CSRF 令牌,我也收到了类似的 CSRF 错误响应。我必须添加到 fetch headers 以匹配我的 Django 后端的安全设置。在这种情况下,我在浏览器中进行中继,因此我从 cookie 中获取 CSRF 令牌。
我已经关注了 CSRF with AJAX in cookies 的 Django 文档。由于我的安全设置,我必须添加“same-origin”凭据。我将标记我必须从中继快速入门教程中更改的几件事
import { get as getCookie} from 'browser-cookies'
return fetch('/graphql/', { // Added the trailing slash here
method: 'POST',
credentials: "same-origin", // Added this line
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': getCookie('csrftoken'), // getting token from cookies
},
body: JSON.stringify({
query: operation.text,
variables,
}),
}).then(response => {
return response.json();
});
这就是为我修复它的原因。