zoukankan      html  css  js  c++  java
  • Django Rest Framework remove csrf

    I know that there are answers regarding Django Rest Framework, but I couldn't find a solution to my problem.

    I have an application which has authentication and some functionality. I added a new app to it, which uses Django Rest Framework. I want to use the library only in this app. Also I want to make POST request, and I always receive this response:

    {
        "detail": "CSRF Failed: CSRF token missing or incorrect."
    }
    

    I have the following code:

    # urls.py
    from django.conf.urls import patterns, url
    
    
    urlpatterns = patterns(
        'api.views',
        url(r'^object/$', views.Object.as_view()),
    )
    
    # views.py
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from django.views.decorators.csrf import csrf_exempt
    
    
    class Object(APIView):
    
        @csrf_exempt
        def post(self, request, format=None):
            return Response({'received data': request.data})
    

    I want add the API without affecting the current application. So my questions is how can I disable CSRF only for this app ?

    shareimprove this question
     
        
    You are already using @csrf_exempt token. You can use this on the whole view. Shouldn't that work? – mukesh Jun 16 '15 at 14:55
        
    No, I still got the detail: "CSRF Failed: CSRF token missing or incorrect." message. I concluded from the answers that I should remove the default authentication. – Irene Texas Jun 17 '15 at 6:04
    1  
    I was running into a VERY similar situation using Token authentication. For anyone else in the same boat:stackoverflow.com/questions/34789301/… – The Brewmaster Jan 17 '16 at 10:13

    6 Answers

    Why this error is happening?

    This is happening because of the default SessionAuthentication scheme used by DRF. DRF's SessionAuthentication uses Django's session framework for authentication which requires CSRF to be checked.

    When you don't define any authentication_classes in your view/viewset, DRF uses this authentication classes as the default.

    'DEFAULT_AUTHENTICATION_CLASSES'= (
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication'
    ),
    

    Since DRF needs to support both session and non-session based authentication to the same views, it enforces CSRF check for only authenticated users. This means that only authenticated requests require CSRF tokens and anonymous requests may be sent without CSRF tokens.

    If you're using an AJAX style API with SessionAuthentication, you'll need to include a valid CSRF token for any "unsafe" HTTP method calls, such as PUT, PATCH, POST or DELETE requests.

    What to do then?

    Now to disable csrf check, you can create a custom authentication class CsrfExemptSessionAuthentication which extends from the default SessionAuthentication class. In this authentication class, we will override the enforce_csrf() check which was happening inside the actual SessionAuthentication.

    from rest_framework.authentication import SessionAuthentication 
    
    class CsrfExemptSessionAuthentication(SessionAuthentication):
    
        def enforce_csrf(self, request):
            return  # To not perform the csrf check previously happening
    

    In your view, then you can define the authentication_classes to be:

    authentication_classes = (CsrfExemptSessionAuthentication, BasicAuthentication)
    

    This should handle the csrf error.

    shareimprove this answer
     
        
    Thanks, great answer. There should be a built in way to do this in restframework, but currently this is the best solution I found. – Omer Oct 13 '15 at 14:06
    1  
    Thank you, it worked! with Django 1.9 – neosergio Apr 17 '16 at 21:01
    1  
    Sorry maybe I missed the point, but isn't a security risk to bypass/disable the csrf protection? – Paolo Feb 5 at 18:37
    1  
    @Paolo OP needed to disable the CSRF authentication for a particular API. But yes, its a security risk to disable the csrf protection. If one needs to disable session authentication for a particular use case, then he can use this solution. – Rahul Gupta Feb 6 at 6:09 
  • 相关阅读:
    7-1 N个数求和
    3662. 最大上升子序列和
    树状数组
    堆优化Dijkstra java模板
    皮亚诺曲线距离
    最长公共子序列(计数问题)
    最小路径覆盖
    极角排序
    2619. 询问
    Hessian矩阵与局部极小值
  • 原文地址:https://www.cnblogs.com/AmilyWilly/p/6438448.html
Copyright © 2011-2022 走看看