0

J'utilise l'authentification basée sur Django Token. (JWT Token est généré par un tiers comme AWS Cognito, nous allons simplement vérifier la signature et l'heure d'expiration).Authentification par jeton Django sans modèle d'utilisateur

Cette application REST ne comportera aucun modèle utilisateur. Celui qui utilise les appels d'API doit être authentifié uniquement par le jeton 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) 

Vues:

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

processus ci-dessus, ne garde pas trace de jeton du tout. Avec/sans jeton, les appels APi fonctionnent. Si je fais ci-dessous deux changements, cela fonctionne.

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

Une façon de le faire est, d'avoir atleast un utilisateur dans mon application et référence utilisateur [Cette webapp peut évoluer à un certain nombre de cas en cas de besoin, afin d'insérer le même utilisateur avec la même « nom d'utilisateur » a être automatisé. ] Mais au lieu de cela, puis-je éliminer le concept "Utilisateur" dans l'authentification?

Répondre

1

Le framework Django REST suppose en grande partie que les requêtes sont authentifiées en fonction d'un utilisateur, mais il fournit un support pour les demandes anonymes d'authentification. Mais il se distingue de l'hypothèse standard de "vérification (django) utilisateur est authentique" en donnant un utilisateur anonyme avec certaines autorisations. Le problème avec votre premier cas est permission décorateur avec "Autoriser tout".

Je suggère d'avoir un utilisateur Django fictif. (Cela ne vous empêche pas de passer à un certain nombre d'instances également).

Utilisez

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

au lieu de

user = AnonymousUser() 

changer Maintenant, le décorateur permission de

@permission_classes((IsAuthenticated,)) 

Cet utilisateur ne peut pas être connecté par personne, sauf si vous définissez un mot de passe, en outre l'exploitation forestière car cet utilisateur ne vous donnera pas accès à votre appel d'API. La seule façon d'accéder à votre API est d'envoyer un Token valide.

Espérons que cela aide.

+0

Merci. Cela a fonctionné comme une solution de contournement pour moi. Lorsque j'utilise des outils tiers comme AWS cognito, je crois que nous ne devrions pas nous préoccuper du modèle d'utilisateur Django. –

0

Essayez de valider si le jeton JWT existe ou non. Il semble que si ce n'est pas le cas, la charge est simplement None et l'utilisateur est anonyme

+0

J'ai aussi essayé. Indépendamment de sinon jwt_token: return Aucun Les appels API sont accessibles par tous. –

+0

Ne devriez-vous pas déclencher une erreur d'authentification si le jeton JWT n'est pas là? – bdbd