47

私はTokenAuthenticationを拡張しましたが、リクエストセッションを使用してトークンを格納するときの作業モデルがありますが、as described hereとしてAuthorizationを渡そうとすると、META変数HTTP_AUTHORIZATION 。私の最初の推測が許可ヘッダーは、Apacheによって除去されている、と私はいくつかのSを読んでいるということであるdjango rest_frameworkに権限ヘッダーがありません。これはapacheのせいですか?

{ 
    '_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', 
      ... 

:私はまた、要求に表示されている私は、ヘッダパラメータとして「Authorization2」を渡した場合ということに気づきました/ Oの質問は、Apacheが基本的な認証と一致しない場合に値を破棄して認証すると述べていますが、AuthorizationヘッダーをDjangoとWSGIRequestに 'パススルー'させる方法はわかりません。誰もがこの問題を解決する方法を知っていますか?

それはそれを求めた後、自分の質問分に答えるために...

答えて

32

申し訳ありませんが何かを変更した場合、私はまた、mod_auth_casとmod_proxyのを使用しています。しかし、それは結局apache2だったことが判明しました!ウェブをクロールし、いくつかの検索結果を見た後、私はコメントでこれを見つけた:

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

私のconfファイルに上記の行を追加し、私のすべての問題を解決するように見えました!うまくいけば、これはユーザーの道のりを助ける!

+0

このApacheの動作を文書化するためのオープンチケットがあります:https://github.com/tomchristie/django-rest-framework/issues/488もし誰かが例えば何かに光を当てることができれば。この点でのNginxの動作も役立つでしょう。 –

+0

@Tom Christie、これはあなたがnginxでやる方法です:proxy_no_cache $ http_pragma $ http_authorization; proxy_cache_bypass $ http_pragma $ http_authorization; proxy_set_header HTTP_AUTHORIZATION $ http_authorization; –

+0

@ SalvatoreIovene私が掘っていたときに、その周りにいくつかの音符を見ました。恐らくNginxをプロキシとして使用する場合にのみ適用されます。 (?) –

55

あなたがApacheとmod_wsgiをを使用している場合は、私が使用してApacheに配備する場合は、その公式のDjangoのRESTフレームワークのウェブサイト

Apacheのmod_wsgiを特定の構成

注意にこれに対する簡単な解決策を見つけましたmod_wsgiでは、認証レベルがアプリケーションレベルではなくApacheによって処理されると想定されているため、認証ヘッダーはデフォルトでWSGIアプリケーションに渡されません。

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

# this can go in either server config, virtual host, directory or .htaccess 
WSGIPassAuthorization On 
+2

ありがとうございます。これはTastypie非セッションベースの認証にも適用されます。 – garromark

+0

これは常に解決策ではありません。 DjangoをfcgidでApacheにデプロイした場合(https://docs.djangoproject.com/en/1.8/howto/deployment/fastcgi/#apache-shared-hostingを参照)、mod_fcgidに "Authentication"ヘッダを渡す必要があります。 (通常vhost.cofに)追加:FcgidPassHeader Authorization – serfer2

+0

ありがとうございます - Ubuntuで私のために働いた14.04 – slogan621

11

それはあなたがやったジャンゴ/ Apacheの展開のどの種類に依存します。あなたは、 "認証" HTTPヘッダーを渡すことができるように、正しいApacheモジュールを指示する必要があります:

  • のApache/mod_wsgiを:

    WSGIPassAuthorization On

  • のApache/mod_fcgid:

    FcgidPassHeader Authorization

他言葉:多くのApacheモジュールは "認証" HTTPヘッダーをフィルタリングするので、Djangoはそれを受け取りません。 Django Appが要求に応じてそれを受け取っていることを確認する必要があります。

参照: django_rest docおよびApache fcgid doc

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

関連する問題