2017-01-14 7 views
0

私はDjango Rest Frameworkを使用してユーザー登録/ログインを使用してWebアプリケーションを構築しています。 私は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', 
    ] 
} 

私はまだ古典的なCSRF verification failed. Request aborted.

Forbidden (CSRF cookie not set.): /users/私のバックエンドの出力に、フロントエンドでこれを取得します

なぜこれは機能しませんか?私は手動で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

また、[this post](http ://stackoverflow.com/questions/17716624/django-csrf-cookie-not-set) – Wilfried

+0

@Wilfried 'get_permissions'の先頭に@method_decorator(csrf_exempt)を追加しようとしましたが、変更はありません –

答えて

0

ジャンゴRESTフレームワークは既に任意APIViewcsrf_exemptを使用してCSRFチェックを行うからCSRFViewMiddlewareを防止します。代わりに、ユーザーがSessionAuthenticationを使用して正常に認証されると、CSRFチェックが明示的に呼び出されます。この小切手を迂回することはできません。通常のDjangoビューはセッションに依存しない可能性があります。この場合、CSRF攻撃は不可能で、csrf_exemptを使用してこれを示すことができます。 SessionAuthenticationを使用する場合、であり、CSRF攻撃に対して脆弱であるため、攻撃を防ぐためにチェックする必要があります。この場合のチェックをバイパスすると、常に脆弱性が表示されるため、DRFではチェックを無効にすることができません。

あなたは基本的にこの問題を解決するには、2つのオプションがあります。それは成功しSessionAuthenticationによって認証されないユーザーを確認してください

  • を。
  • Cookieが設定されていることを確認し、トークンをX-CsrfTokenリクエストヘッダーに送信します。
+0

私は分かりませんSessionAuthenticationがCSRF保護にどのように関係しているか。私はDjangoで前者を持っていないことがDjangoで分かりましたが、なぜそれが当てはまるのか分かりません。 –

+1

CSRF攻撃は、あなたの知識なしにセッションを悪用する方法です。セッションや同様の仕組みがない場合、攻撃者がクロスサイトリクエストを偽装することによって悪用することはありません。 – knbk

+0

ありがとうございます。完璧な意味合いを持つ。したがって、言い換えれば、 'SessionAuthentication'で認証されれば、' csrf_exempt'は何の効果もありません。どんなシナリオで 'csrf_exempt'が実際に役に立つのでしょうか?私が読んだところによると、CSRFがチェックされている 'SessionAuthentification'を使うときだけで、' csrf_exempt'を使うとCSRFがチェックされていないので役に立たなくなります。 –

関連する問題