2013-04-12 10 views
6

django-rest-frameworkを使用しています。私は、nginxの背後にある運用環境でHTTP 403エラーを受け取っています。私がGET操作をサポートするためにAPIViewから継承特定のビューを呼び出すと、私が手:django restフレームワークは、nginxの背後にあるときは403を返しますが、直接は受け入れません。

{"detail": "Invalid username/password"} 

をしかし...私はブラウザのみでこれを取得します。非常に同じURLのためにカールを使用すると、私はそれを取得しません。私はURLに直接ヒットした場合でも、AJAX経由でURLを読み込んだ場合でも、ChromeとFirefoxの両方でこのエラーが発生します。

最初に管理者アカウントでDjango管理者からログインしてもエラーは発生しません。

また、私はこれを得るには、nginxの後ろから実行しています。私がDjangoデベロッパーサーバー、またはgunicornを実行してポートに直接アクセスすると、うまくいき、匿名でURLを幸せに叩くことができます。私はこの前にnginxを置く場合、同じgunicorn/runserverに転送するには、私はこのエラーが発生します。

多分私のnginx proxy_passの設定と関係がありますか?

location/{ 
    proxy_pass http://127.0.0.1:8000; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
} 

私はdjango rest framework 2.2.6、Django 1.5、nginx 1.2.7を実行しています。

休止フレームワークでスロットリングを愚かな数値に設定し、既定ですべてが開いているように見えるアクセス許可を調べましたが、明示的に設定されています。

誰でも正しい方向に向けることができますか?

ありがとうございます!

ルド。

+0

django-rest-frameworkの認証設定はどうですか? – iMom0

+0

私はちょうど適切と思われるデフォルトを使用しています。 – Ludo

答えて

0

スロットルが有効になっている場合は、403 FORBIDDENが表示されます。この問題に基づいて:https://github.com/tomchristie/django-rest-framework/issues/667、request.user/request.authの遅延評価をオフにするのがおそらく最善の方法です。

+1

RESTフレームワークの最新バージョンに更新すると、この問題が解決するはずです。 (参照チケットは現在閉鎖されています) –

+0

こんにちは。ありがとう!私は2.2.6にありますが、これにはこの修正が含まれているようです。私はスレッドに従おうとしていますが、スロットルを無効にする簡単な方法はありません。私は非常に高いスロットル値を設定しました。私はカスタム認証クラスを試してみるべきでしょうか?私は別のことを聞かない限り、私は次にそれを試してみます。ありがとうございました – Ludo

+0

私はスロットルと認証をオフにし、すべてが動作し始めました。ありがとう。 – Ludo

23

私の場合、ApacheでHTTP基本認証が設定されていましたが、私のDjangoプロジェクトでは設定されていませんでした。リクエストには認証ヘッダーが含まれていたので、Djangoアプリはそれを認証したいと思っていました。これらの設定を使用してDjangoのRESTフレームワークでI無効認証:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': [] 
} 
+1

ありがとう!これは私の問題でした。 – jarv

+0

すべての認証クラスを無効にする必要はなく、基本認証だけを削除してください。ここで別の答えを見るhttp://stackoverflow.com/questions/19693433/django-rest-framework-behind-http-basic-authentication – chhantyal

+0

優れています。これはVPS + Apache + Passenger(Dreamhost)を使用した私の問題でした。 – oooyaya

3

それは(@のSjoerdの場合のように)基本的なHTTP認証だとあなたは、Djangoの認証を必要としない場合は、あなたも自分の中でAuthorizationヘッダを削除することができますnginxのリバースプロキシの設定:

location/{ 
    ... 
    proxy_set_header Authorization ""; 
} 
+1

ありがとう!私たちは同じ問題にぶつかりました。これが助けになりました! –

+0

これは受け入れられる回答である必要があります。 – Lev

2

あなたはそれがなければならないとして(基本認証、 クライアント(ブラウザ)に送信「認証」ヘッダの後ろにあるサイトへのリクエストの送信 - 参照:「Basic認証」上をウィキペディア)。

Ngnixがアプリケーションに渡します。

Django Rest FrameworkはBasicAuthenticationもサポートしています。これはデフォルトで有効になっています。

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
    ) 
} 

ソース:http://www.django-rest-framework.org/api-guide/authentication/

だから、ジャンゴ・休息・フレームワークは、「認証」ヘッダを見て、それはパスワードを使用してDjangoのユーザーでなければなりませんと考えています。

このようなユーザーが存在しない場合は、「HTTP 401 Unauthorized」が表示されます。 参照:http://www.django-rest-framework.org/api-guide/authentication/#basicauthentication

Soultions

1選ん: a)は、あなたのngnixサイトの設定に追加

location/{ 
    ... 
    proxy_set_header Authorization ""; 
    ... 
} 

のでDRFは、 '認証' ヘッダーを取得することはできませんので、それはしようとはしませんdjangoユーザーと一致するようにします。この変更後

- (!空のヘッダ

b)の基本的な認証は、Djangoの側で使用することはできませんが(自分のDjangoの設定で)REST_FRAMEWORKから「rest_framework.authentication.BasicAuthentication」を取り除きます。

定義されていない場合は、あなたのDjangoの設定に追加します。

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
    ) 
} 

Probbably最善の解決策。

c)基本認証にdjangoユーザー/パスワードを使用しますか?

Realy? - しないでください!

関連する問題