首页 > 解决方案 > 被禁止(CSRF 令牌丢失或不正确。):/myurl/ 覆盖 JSONWebTokenAPIView 发布方法时出错

问题描述

我继承了ObtainJSONWebToken并试图覆盖JSONWebTokenAPIView的post方法,但每次我点击API都会抛出错误:禁止(CSRF令牌丢失或不正确。):/myurl/

视图.py

from rest_framework_jwt.views import ObtainJSONWebToken

class LoginDrfJwtView(ObtainJSONWebToken):
    def post(self, request, *args, **kwargs):
        response = super(ObtainJSONWebToken, self).post(request, *args, **kwargs)
        if condition == True:
            # my code
        return True

设置.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}

JWT_AUTH = {
    'JWT_AUTH_HEADER_PREFIX': 'JWT',
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300)
}

网址.py

from django.urls import path
from . import views

urlpatterns = [
    path('login-jwt-over/', views.LoginDrfJwtView),

]

标签: djangopython-3.xdjango-rest-frameworkcsrfdjango-rest-framework-jwt

解决方案


向这个基于类的视图添加一个绕过 CSRF 检查的身份验证类。CSRF 错误发生在没有定义任何身份验证类的视图上。

您需要创建一个继承自 SessionAuthentication 并始终返回的身份验证类。它可能类似于以下内容:

from rest_framework.authentication import SessionAuthentication

class CsrfExemptAuth(SessionAuthentication):

    def bypass_csrf(self, request):

        return

然后,在您看来,添加到 authentication_classes。

authentication_classes = (CsrfExemptAuth,)


推荐阅读