64

TokenAuthenticationトークンを保存するためにリクエスト セッションを使用するとき、なんとか拡張でき、動作モデルがありますが、ここで説明されているようAuthorizationにヘッダー パラメータとして渡そうとすると、応答が 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 も使用します。

4

4 に答える 4

79

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
于 2013-09-02T02:36:40.903 に答える
39

質問してから数分後に自分の質問に答えて申し訳ありません。しかし、結局のところ、それは apache2 であることが判明しました! Web をクロールしていくつかの検索結果を調べた後、コメントに次のようなものを見つけました。

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

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

于 2012-11-14T21:27:24.660 に答える
17

これは、実行した Django/Apache デプロイメントの種類によって異なります。「Authentication」HTTP ヘッダーを渡すことを許可するように、正しい Apache モジュールに指示する必要があります。

  • アパッチ/mod_wsgi:

    WSGIPassAuthorization On

  • アパッチ/mod_fcgid:

    FcgidPassHeader Authorization

つまり、多くの Apache モジュールは「Authentication」HTTP ヘッダーをフィルタリングするため、Django はそれを受け取りません。Django アプリがリクエストでそれを受け取っていることを確認する必要があります。

参照: django_rest docおよびApache fcgid doc

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

于 2015-05-18T18:23:41.283 に答える