1. ホーム
  2. django

[解決済み] CSRFに失敗しました。CSRFトークンがないか不正確です

2022-02-15 14:41:32

質問

Django 1.7 と django-rest-framework を使っています。

JSONデータを返すAPIを作成し、これを私の settings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',),
    'DEFAULT_RENDERER_CLASSES': (
    #   'rest_framework.renderers.XMLRenderer',
    'rest_framework.renderers.JSONRenderer',
    #   'rest_framework.renderers.BrowsableAPIRenderer',
    )
}

GETコールをすると、すべてのデータを返してくれますが、PUT/PATCHで試すと、次のようになります。

--------Response Headers---------
Status Code: 403
Date: Wed, 29 Oct 2014 18:51:42 GMT
Vary: Cookie
Server: WSGIServer/0.1 Python/2.7.8
Allow: GET, POST, PUT, PATCH, HEAD, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
---------------------------------

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

これはログインしているときのみ発生し、匿名の場合は正しくPUT/PATCHすることができます。

で試してみました。 @csrf_exempt というエラーが発生しました。 rest_framework.permissions.AllowAny を設定する必要があるのですが...。

何がどうなっているのか、さっぱりわからない。何が問題なのか、どなたかご存知でしょうか?

解決方法を教えてください。

を使用している場合 セッション認証 の場合、通常 CSRF をチェックする必要がある Django の認証を使っていることになります。Django REST Framework は、このことを SessionAuthentication そのため、CSRF トークンを X-CSRFToken ヘッダを作成します。

Django ドキュメント には、jQuery を使用して CSRF トークンを取得し、リクエストで送信する方法についての詳細情報が記載されています。CSRF トークンは csrftoken HTTPレスポンスから取得できるもので、使用する言語によって異なります。

CSRF クッキーが取得できない場合、これは通常 SessionAuthentication . を調べることをお勧めします。 トークンオーセンティケーション または OAuth 2.0 を使用します。