7

django-rest-framework の使用。nginx の背後で本番環境で実行すると、HTTP 403 エラーが発生します。APIView から継承して GET 操作をサポートする特定のビューを呼び出すと、次のようになります。

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

しかし...私はこれをブラウザでしか取得しません。まったく同じ URL に curl を使用すると、取得できません。Chrome と Firefox の両方で、URL を直接ヒットするか、AJAX 経由で URL を読み込むかに関係なく、このエラーが発生します。

最初に管理者アカウントを使用して Django Admin 経由でログインすると、エラーは発生しません。

また、これは nginx の背後から実行している場合にのみ得られます。Django dev サーバーまたは 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 を実行しています。

残りのフレームワークでスロットリングをばかげた高い数値に設定し、デフォルトですべて開いているように見えるアクセス許可を調べました(ただし、明示的にも設定されています)。

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

ありがとう!

ルード。

4

4 に答える 4

26

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

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': []
}
于 2014-03-26T14:02:06.973 に答える
4

それが基本的な http 認証 (@Sjoerd の場合のように) であり、django 認証が必要ない場合はAuthorization、nginx リバース プロキシ構成でヘッダーを削除することもできます。

location / {
    ...
    proxy_set_header   Authorization    "";
}
于 2015-06-04T21:51:09.300 に答える
3

基本認証の背後にあるサイトにリクエストを送信すると、クライアント(ブラウザ)は「Authorization」ヘッダーを送信します(当然のことですが、ウィキペディアの「基本アクセス認証」を参照してください)。

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-rest-framework は「Authorization」ヘッダーを見て、パスワードを持つ django ユーザーである必要があると考えます。

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

ソウルションズ

1 つ選んでください: a) ngnix サイト構成に追加します。

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

そのため、DRF は 'Authorization' ヘッダーを取得しないため、django ユーザーとの一致を試みません。

この変更後 - 基本認証は django 側で使用できません (空のヘッダー!

b) REST_FRAMEWORK から "rest_framework.authentication.BasicAuthentication" を削除します (django 設定で)。

定義されていない場合は、django 設定に追加します。

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

おそらく最良の解決策。

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

本当に?- やめて!

于 2016-07-27T11:07:19.327 に答える