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 
  • 相关阅读:
    163.扩展User模型-一对一方式扩展
    162.扩展User模型-使用Proxy模型
    161.内置User模型的基本使用
    160.验证和授权系统的概述
    159.SQL注入的实现和防御措施
    OS课程 ucore_lab2实验报告
    IdentityServer4专题之七:Authorization Code认证模式
    IdentityServer4专题之六:Resource Owner Password Credentials
    IdentityServer4专题之五:OpenID Connect及其Client Credentials流程模式
    IdentityServer4专题之四:Authorization Endpoint、Token Endpoint、scope、Access Token和Refresh Token、授权服务器发生错误
  • 原文地址:https://www.cnblogs.com/AmilyWilly/p/6438448.html
Copyright © 2011-2022 走看看