web-dev-qa-db-ja.com

Django rest_frameworkに認可ヘッダーがありません。Apacheのせいですか?

私はTokenAuthenticationを拡張することができました。リクエストセッションを使用してトークンを保存するとき、作業モデルがありますが、Authorizationをヘッダーパラメーターとして渡そうとすると here 、META変数HTTP_AUTHORIZATIONなしで応答が返されることに気付きました。また、ヘッダーパラメータとして「Authorization2」を渡すと、リクエストで表示されることがわかりました。

{
    '_content_type': '', 
    'accepted_media_type': 'application/json', 
    '_request': <WSGIRequest
        path:/api/test_auth/,
        GET:<QueryDict: {}>,
        POST:<QueryDict: {}>,
        COOKIES:{
            'MOD_AUTH_CAS_S': 'ba90237b5b6a15017f8ca1d5ef0b95c1',
            'csrftoken': 'VswgfoOGHQmbWpCXksGUycj94XlwBwMh',
            'sessionid': 'de1f3a8eee48730dd34f6b4d41caa210'
        },
        META:{
           'DOCUMENT_ROOT': '/etc/Apache2/htdocs',
           'GATEWAY_INTERFACE': 'CGI/1.1',
           'HTTPS': '1',
           'HTTP_ACCEPT': '*/*',
           'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
           'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch',
           'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8',
           'HTTP_AUTHORIZATION2': 'Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4c',
           ...

私の最初の推測は、Apacheによって認可ヘッダーが削除されていることであり、基本的な認可と認証に一致しない場合にApacheが値をスローすることを示すいくつかのS/O質問を読んだことがありますが、どうすればいいのか分かりませんAuthorizationヘッダーをDjangoおよびWSGIRequestに「パススルー」することを許可します。この問題を解決する方法を知っている人はいますか?

Mod_auth_casとmod_proxyも使用します(変更がある場合)。

55
steve-gregory

質問してから数分後に回答して申し訳ありません。しかし、結局のところ、Apache2でした。ウェブをクロールし、いくつかの検索結果を調べた後、コメントでこれを見つけました:

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

Confファイルに上記の行を追加すると、すべての問題が解決したようです!うまくいけば、これがユーザーの将来に役立つことを願っています!

35
steve-gregory

Apacheとmod_wsgiを使用している場合、公式のDjango=RESTフレームワークWebサイト

Apache mod_wsgi固有の設定

Mod_wsgiを使用してApacheにデプロイする場合、認証はアプリケーションレベルではなくApacheによって処理されると想定されるため、デフォルトでは認証ヘッダーがWSGIアプリケーションに渡されないことに注意してください。

Apacheにデプロイし、非セッションベースの認証を使用している場合、必要なヘッダーをアプリケーションに渡すようにmod_wsgiを明示的に構成する必要があります。これは、適切なコンテキストでWSGIPassAuthorizationディレクティブを指定し、「オン」に設定することで実行できます。

# this can go in either server config, virtual Host, directory or .htaccess 
WSGIPassAuthorization On
66
Steven

Django/Apacheの展開の種類によって異なります。 「認証」HTTPヘッダーを渡すことができるように、正しいApacheモジュールに伝える必要があります。

  • Apache/mod_wsgi:

    WSGIPassAuthorization On

  • Apache/mod_fcgid:

    FcgidPassHeader Authorization

つまり、多くのApacheモジュールが「認証」HTTPヘッダーをフィルタリングするため、Djangoは受信しません。Djangoアプリが受信していることを確認する必要があります要求に応じて。

Django_rest doc および Apache fcgid doc を参照してください。

注:Apache設定を変更した後、Apacheデーモンを再起動するか、.cgiファイルをリロードするように指示する必要があります(つまり、touch my_site_fcgifile.fcgi)。

13
serfer2