0

私はDjango Tokenベースの認証を使用しています。 (JWTトークンはAWS Cognitoのような第三者によって生成され、署名と有効期限を確認するだけです)。Djangoのトークンベースのユーザーなしの認証モデル

このRESTアプリケーションにはユーザーモデルはありません。API呼び出しを使用するユーザーは、JWTトークンによってのみ認証される必要があります。

ビューで
class JSONWebTokenAuthentication(TokenAuthentication): 
    def authenticate_credentials(self, jwtToken): 
     try: 
      payload = jwt.decode(jwtToken, secret_key,verify=True) 
      # user = User.objects.get(username='root') 
      user = AnonymousUser() 
     except (jwt.DecodeError, User.DoesNotExist): 
      raise exceptions.AuthenticationFailed('Invalid token) 
     except jwt.ExpiredSignatureError: 
      raise exceptions.AuthenticationFailed('Token has expired') 
     return (user, payload) 

:プロセス上

@api_view(["POST"]) 
@authentication_classes((JSONWebTokenAuthentication,)) 
@permission_classes((AllowAny,)) 

、全くトークンを追跡しません。トークンの有無にかかわらず、APiコールが機能しています。私が2つ以下の変更を加えた場合、それは機能しています。それを行うには

user = User.objects.get(username='root') 
#user = AnonymousUser() 
@permission_classes((IsAuthenticated,)) 

一つの方法は、持っているので、同じ「ユーザー名」と同じユーザを挿入し、必要なときにユーザーが[このWebアプリケーションは、任意の数のインスタンスに拡張可能性があることを私のアプリとリファレンスに少なくとも1人のユーザーを持つこと、です自動化される。 ]。しかし、代わりに、私は認証で "ユーザー"の概念を排除できますか?

答えて

1

Django RESTフレームワークは、リクエストがユーザーに基づいて認証されていると主張していますが、認証匿名リクエストをサポートしています。しかし、匿名ユーザーに特定の権限を与えることによって、 "(django)ユーザーは本物であることを確認する"という標準的な前提から際立っています。あなたの最初のケースでの問題は、許可のデコレータで「すべて許可」です。

ダミーのDjangoユーザーをお勧めします。 (スケーリングからインスタンスの数に制限はありません)。

使用

user = User.objects.get_or_create(username='whatever')[0] 

代わり

user = AnonymousUser() 

の今、あなたはパスワードを設定しない限り、誰でもログインすることができません

@permission_classes((IsAuthenticated,)) 

このユーザーへの権限のデコレータを変更、さらにログこのユーザーはAPI呼び出しへのアクセス権を与えないため、 APIにアクセスする唯一の方法は、有効なトークンを送信することです。

これが役に立ちます。

+0

ありがとうございます。それは私の回避策として働いた。 AWSコグニートのようなthirdpartyツールを使用しているとき、私はDjango Userモデルを気にするべきではないと考えています。 –

0

JWTトークンが存在するかどうかを検証してください。ペイロードはNoneであり、ユーザーは匿名です。

+0

私もそれを試しました。関係なく、 jwt_token: 返り値なし APIコールは誰でもアクセスできます。 –

+0

JWTトークンが存在しない場合、認証エラーを発生しませんか? – bdbd

関連する問題