Django CSRF和axios发布403禁止

时间:2020-03-09 15:57:02

标签: django graphql axios csrf nuxt.js

我将Django与石墨烯一起用于后端,将Nuxt用于前端。当我尝试将请求从nuxt发送到Django时出现问题。在邮递员中,一切正常,在nuxt中,我收到403错误。

Django

# url.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', GraphQLView.as_view(graphiql=settings.DEBUG,
                                     schema=schema)),
]
# settings.py

CORS_ORIGIN_WHITELIST = 'http://localhost:3000'
CORS_ALLOW_CREDENTIALS = True
CSRF_USE_SESIONS = False
CSRF_COOKIE_HTTPONLY = False
CSRF_COOKIE_SAMESITE = None

NuxtJs

# nuxt.config.js

axios: {
  baseURL: 'http://127.0.0.1:8000/',
  debug: false,
  progress: true,
  credentials: true
},
# plugins/axios.js

await $axios.onRequest((config) => {
    config.headers.common['Content-Type'] = 'application/json'
    config.xsrfCookieName = 'csrftoken'
    config.xsrfHeaderName = 'X-CSRFToken'
    const csrfCookie = app.$cookies.get('csrftoken')
    config.headers.common['X-CSRFToken'] = csrfCookie
    console.log(config)
# store/contact.js

import { AddMessage } from '../queries/contact.js'

export const actions = {
  async send() {
    const message = await this.$axios({
      url: 'api/',
      method: 'POST',
      data: AddMessage
    })
  }
}

# queries/contact.js

export const AddMessage = {
  query: `
    mutation AddContact($input: AddMessageInput!){
      addMessage(input: $input){
        message{
        name
        email
        body
        terms
        }
      }
    }
  `,
  variables: `
  {
    "input":{
      "name": "test",
      "email": "test@test.com",
      "body": "test",
      "terms": true,
    }
  }
  `,
  operationName: 'AddMessage'
}

那是

Here是axios帖子中的请求标头。对于我来说,奇怪的是Cookie的值错误。 X-CSRFToken标头中包含令牌的良好价值。

Here是axios发布请求中的日志。对我来说,另一个奇怪的事情是未定义的标头:Content-Type和X-CSRFToken

谢谢!

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,我想在这里分享解决方案。

cookie值错误的问题是由设法(从我不记得如何)从后端应用程序获取csrf cookie的前端应用程序生成的。在 X-CSRFToken 标头中是从响应的 Set-cookie 标头中接收到的令牌,在 Cookie 标头中是来自后端应用程序的cookie。

在我将 localhost 更改为 127.0.0.1 后,添加了 config.xsrfCookieName = 'csrftoken'在axios插件中 我能够分离应用程序,独立保存和使用Cookie。

第二个问题,带有未定义的头文件,由axios生成。这两行代码解决了该问题。这些也是在axios onRequest方法中添加的。

config.xsrfHeaderName = 'X-CSRFToken'
config.headers['Content-Type'] = 'application/json'