2017-06-21 10 views
1

何らかの理由でデータベースでトークンが削除されたときに401を返す方法を見つけるのは難しいです。Django Rest FrameworkでAuthトークンが見つからないときに401を返す方法

私を説明しましょう。

私の一般的な設定では、SessionAuthenticationとTokenAuthenticationスキームを使用しています。私は、

class AcmeObtainAuthToken(APIView): 
    throttle_classes =() 
    permission_classes =() 
    parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,) 
    renderer_classes = (renderers.JSONRenderer,) 
    serializer_class = AcmeAuthTokenSerializer 

    def post(self, request, *args, **kwargs): 
     serializer = self.serializer_class(data=request.data) 
     serializer.context = {'request': self.request} 
     serializer.is_valid(raise_exception=True) 
     user = serializer.validated_data['user'] 
     token, created = Token.objects.get_or_create(user=user) 
     return Response({'token': token.key, 
        'school': school, 
        'user': user.id}) 

obtain_auth_token = AcmeObtainAuthToken.as_view() 

私の問題は、DBに保存されているときに、トークントークンを送信何らかの理由とクライアントのために行っていることである。

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.TokenAuthentication', 
    ), 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.IsAuthenticated', 
    ), 
    'DEFAULT_FILTER_BACKENDS': (
     'rest_framework.filters.DjangoFilterBackend', 
    ), 
    'DATETIME_FORMAT': '%a, %d %b %Y %H:%M:%S %z', 
    'DATETIME_INPUT_FORMATS': ['iso-8601', '%Y-%m-%d %H:%M:%S', '%a, %d %b %Y %H:%M:%S %z'], 
    'DATE_FORMAT': '%Y-%m-%d', 
    'DATE_INPUT_FORMATS': ['%Y-%m-%d', '%m/%d/%YYYY'], 
    'PAGE_SIZE': 20 
} 

は、私はこのように、認証トークンを生成するためのビューを持っています

:私はこれは本当に不可解ですdocsを見てみると401

を必要とする場合、403を取得使用される応答の種類は、認証方式によって異なります。複数の認証スキームが使用されているかもしれませんが、レスポンスのタイプを決定するために使用できるスキームは1つだけです。ビューの最初の認証クラスは、応答のタイプを決定するときに使用されます。

それはどうですか?例はありません。DRFがここでどのようにその魔法をしているのかちょっと混乱しています...

+0

で削除「rest_framework.authentication.SessionAuthentication」 DEFAULT_AUTHENTICATION_CLASSES – Ykh

答えて

1

403その場合に得られる回答です。 this linkを見てください:

サーバーは要求を理解しましたが、それを実行することを拒否しています。認可は役立たず、要求は繰り返されてはならない(SHOULD NOT)。

本質的に、クライアントは正しい要求をしましたが、トークンが見つからないため、彼のアクセスは禁止されています(403)。

あなたが本当に401エラーで応答したい場合、あなたはBloowatchObtainAuthTokenビューで、次のようなものを試すことができます。

class BloowatchObtainAuthToken(ObtainAuthToken): 
    def post(self, request, *args, **kwargs): 
     response = super(BloowatchObtainAuthToken, self).post(request, *args, **kwargs) 
     try: 
      token = Token.objects.get(user=request.user) # or what you are validating against 
      other stuff here... 
     except Token.DoesNotExist: 
      return Response({'error': 'Token does not exist'}, status=401) 

幸運:)

+0

Johnさん、ありがとうございます。これはあまり一般的ではないことはわかっていますが、フロントエンドがこれをどのように処理しているのか、401ではなく403にログインするようにリダイレクトしているので、なぜなら、ユーザーはどこにでも403のものを手に入れることができますが、ログインする必要があるかどうかは分からないからですもう一度...歓声! – AlejandroVK

関連する問題