2017-01-14 2 views
0

저는 Django Rest Framework를 사용하여 사용자 등록/로그인으로 webapp를 구축하고 있습니다. 사용자가 CSRF 토큰이 필요하지 않은보기를 면제하려고합니다. 이는 내 생각이 지금과 같은 모습입니다 :Django csrf_exempt가 SessionAuthentication과 함께 작동하지 않습니다.

class UserSignUpView(generics.CreateAPIView): 
    permission_classes = [] # FIXME: doesn't seem to be working 
    serializer_class = UserSerializer 

    @method_decorator(csrf_exempt) 
    def post(self, request, *args, **kwargs): 
     super().post(self, request, *args, **kwargs) 

    def get_permissions(self): 
     if self.request.method == 'POST': 
      return (permissions.AllowAny(), TokenHasReadWriteScope()) 
     return False 

내 settings.py은 다음과 같습니다

REST_FRAMEWORK = { 
    # Use Django's standard `django.contrib.auth` permissions, 
    # or allow read-only access for unauthenticated users. 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
    ), 
    'DEFAULT_PERMISSION_CLASSES': [ 
     'rest_framework.permissions.AllowAny', 
    ] 
} 

난 아직도 내 백엔드 출력 Forbidden (CSRF cookie not set.): /users/에이를 얻고 앞에 고전 CSRF verification failed. Request aborted.

을 종료

왜 작동하지 않습니까? CSRF 쿠키를 수동으로 설정하지 않은 것과 관련이있을 수 있습니까?

+0

get_permissions는 장식자를 필요로하지 않습니다. csrf_exempt? POST 메소드를 사용 중입니다. @csrf_exempt는 다음과 같이 작성할 수 있습니다. [Documentation] (https://docs.djangoproject.com/en/1.10/ref/csrf/#django.views.decorators.csrf.csrf_protect) – Wilfried

+0

[이 게시물] (http : //stackoverflow.com/questions/17716624/django-csrf-cookie-not-set) – Wilfried

+0

@Wilfried'get_permissions'의 맨 위에'@method_decorator (csrf_exempt)'를 추가하려고했지만 아무런 변화가 없었습니다. –

답변

0

장고 REST 프레임 워크는 에 csrf_exempt을 사용하여 CSRFViewMiddleware에서 CSRF 확인을 수행하지 못하게합니다. 대신 사용자가 SessionAuthentication을 사용하여 성공적으로 인증되면 CSRF 검사를 명시 적으로 호출합니다. 이 수표를 우회 할 수 없으며 그렇게 할 수도 없습니다. 보통 장고보기는 세션에 의존하지 않을 수도 있습니다. CSRF 공격은 불가능합니다. csrf_exempt을 사용하여이를 나타낼 수 있습니다. SessionAuthentication을 사용하면 이 CSRF 공격에 취약하며 공격을 막기 위해 검사가 필요합니다. 이 경우 수표를 무시하면 취약점에 노출 될 수밖에 없으므로 DRF에서는 수표를 사용하지 못하게합니다.

  • 이 성공적 SessionAuthentication에 의해 인증되지 않은 사용자 확인 :

    당신은 기본적으로이 문제를 해결하는 두 가지 옵션이 있습니다.

  • 쿠키가 설정되어 있는지 확인하고 X-CsrfToken 요청 헤더에 토큰을 보냅니다.
+0

이해가 안됩니다. SessionAuthentication은 CSRF 보호와 관련이있다. 장고에서는 후자가 없으면 장고를 가질 수 없다는 것을 알지만, 왜 그런지는 알지 못합니다. –

+1

CSRF 공격은 사용자 모르게 세션을 악용하는 방법입니다. 세션이나 이와 유사한 메커니즘이 없으면 공격자가 사이트 간 요청을 위조하여 악용 할 수있는 것이 없습니다. – knbk

+0

설명해 주셔서 감사합니다. 완벽하게 이해합니다. 따라서 단지 'SessionAuthentication'으로 인증되면'csrf_exempt'는 아무런 효과가 없습니다. 그렇다면 어떤 시나리오에서'csrf_exempt'가 실제로 유용할까요? 내가 읽은 바에 따르면 CSRF가 체크 된'SessionAuthentification'을 사용할 때만 그렇기 때문에'csrf_exempt'를 사용하면 CSRF가 체크되지 않기 때문에 쓸모가 없다. –