14

私のビューの1つでTokenAuthenticationを使用しようとしています。 http://django-rest-framework.org/api-guide/authentication.htmlに記載されているように、私はログインから受け取ったトークンを、私が送信するリクエストに「Authorization」というHTTPヘッダーとして追加します。Django TokenAuthenticationに「Authorization」HTTPヘッダーがありません

問題は私のunittestsで認証が失敗することです。私は、ヘッダがチェックされていることがわかりTokenAuthenticationクラスに探し は「HTTP_AUTHORIZATION」でなく「認証」

ビュー私が使用している:「HTTP_AUTHORIZATION」にヘッダーを変更

class DeviceCreate(generics.CreateAPIView): 
    model = Device 
    serializer_class = DeviceSerializer 

    authentication_classes = (TokenAuthentication,) 
    permission_classes = (IsAuthenticated,) 

動作するようです何かが間違っていると感じます。

何か不足していますか?

答えて

16

「HTTP_AUTHORIZATION」私はヘッダがチェックされていることがわかりTokenAuthenticationクラスにされてみるとない「認証」

かなり本当ない、それはだ要求META辞書、ヘッダーで検索を行います実際に探しているのは先行するHTTP_であるため、request.META.get('HTTP_AUTHORIZATION', '')です。実際には、リクエストでAuthorizationヘッダーを参照しています。

問題は私のユニットテストでは、認証が は「HTTP_AUTHORIZATION」にヘッダを変更する私は二重のテストクライアントがどのように見えるか確認やりなさい

動作しているようです失敗したということですが、私はHTTP_AUTHORIZATIONを設定すると信じていますあなたが実際にAuthorizationヘッダーを設定するのと同等のものを得るために必要なものです。 httpリクエストを実際に作成した場合は、authヘッダーの設定が期待どおりに機能することがわかります。

ここrequest.METAのドキュメントを参照してください:https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META

編集request.METAにヘッダーをご覧の上、

Djangoのドキュメント:上記のように、CONTENT_LENGTHおよびCONTENT_TYPEを除き

を、 要求内のHTTPヘッダーは、 によってすべての文字を大文字に変換してMETAキーに変換され、置き換えられます任意のハイフンを とし、名前にHTTP_プレフィックスを追加します。たとえば、X-Benderと呼ばれる ヘッダーは、METAキーHTTP_X_BENDERにマップされます。テストクライアントでのヘッダーを設定するに

Djangoのドキュメント:

しかし、あなたはいくつかのデフォルトのヘッダーを指定するには、キーワード引数を使用することができます。例えば、この各要求にUser-Agent HTTPヘッダを送信します:

C =クライアント(HTTP_USER_AGENT = 'のMozilla/5.0')

4

Tom's answerが微細ではなく、コンプリート。

あなたのコードは、デベロッパー環境で正常に動作しますが(runserver)、WSGIサーバー(私の場合はApache)で試してみると、サーバーはAuthorizationヘッダーを取り除くことができます!

あなたがリクエストにAuthorizationヘッダを維持し、それは素晴らしい動作させるためにBoone's Blog上のApacheのconfのための良い修正を見つけることができます:ブログに

RewriteEngine on 
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] 
+0

リンクが死んでいるが、その先端は私の正気を救いました。 Apache/WSGIがヘッダーを削除していたことを知らなかった! – twig

関連する問題