CSRF 失败:CSRF 令牌缺少 django REST + Vuejs acquire_auth_token

问题描述 投票:0回答:1

我正在发出

POST
请求以从后端获取
token
。出于安全原因,我有
traefik
提供
https
。它有效。

但是当我部署

Vuejs
并使用相同的有效负载制作
POST
时。我在
Chrome
浏览器中收到错误。

detail: "CSRF Failed: CSRF token missing."

我在 stackoverflow 上搜索过。我想遵循安全概念,然后禁用 CSRF 不是一个选项。

import {ref} from "vue";
import {BACKEND_URL} from "../constants";

const getLoginToken = () => {
  const token = ref('')
  const tokenError = ref(null)

  const fetchToken = async(username, password) => {
    try{
      const requestOptions = {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          "username": username,
          "password": password
        }),
        redirect: 'follow',
      }
      const url = BACKEND_URL + '/api/auth-token/'
      console.log(url)
      let data = await fetch(url, requestOptions)
      if(!data.ok){
        throw Error(data.statusText)
      }
      token.value = await data.json()
    }
    catch(err){
      tokenError.value = err.message
      console.log(tokenError.value)
    }
  }
  return { token, tokenError, fetchToken }
}

export default getLoginToken

settings.py

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 10,
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework.authentication.SessionAuthentication",
        "rest_framework.authentication.TokenAuthentication",
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
    ),
    "DEFAULT_PERMISSION_CLASSES": ("rest_framework.permissions.IsAuthenticated",),
    "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
}

`url.py

from django.views.decorators.csrf import csrf_exempt
...
path("api/auth-token/", csrf_exempt(obtain_auth_token)),
...

但是不起作用。

问题:
我无法从生产服务器获取

token

问题:
我已经禁用了

CSRF
,但为什么还是出错?

django vue.js django-rest-framework csrf
1个回答
0
投票

因为我很着急。我决定制作自己的函数并继续。

@api_view(['POST'])
@authentication_classes([])
@permission_classes([])
def my_obtain_auth_token(request, *args, **kwargs) -> Response:
    """My customize obtain_auth_token."""
    serializer = AuthTokenSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    user = serializer.validated_data['user']
    token, created = Token.objects.get_or_create(user=user)
    return Response({'token': token.key})
© www.soinside.com 2019 - 2024. All rights reserved.