2017-01-26 4 views
1

J'ai trouvé en ligne que nous sommes en mesure de passer outre JSONWebTokenSerializer en ayant ceci dans notre url url(r'^login/', ObtainJSONWebToken.as_view(serializer_class=CustomJWTSerializer)), et vue jePourquoi la réinitialisation de JSONWebTokenSerializer ne cesse-t-elle pas de renvoyer le jeton? python

class CustomJWTSerializer(JSONWebTokenSerializer): 

    def __init__(self, *args, **kwargs): 
     super(JSONWebTokenSerializer, self).__init__(*args, **kwargs) 

     self.fields['email'] = serializers.CharField() 
     self.fields['password'] = PasswordField(write_only=True) 

    def validate(self, attrs): 
     credentials = { 
      'username': attrs.get('email'), 
      'password': attrs.get('password') 
     } 

     print(credentials) 

     if all(credentials.values()): 
      user = authenticate(**credentials) 

      if user: 
       if not user.is_active: 
        msg = _('User account is disabled.') 
        raise serializers.ValidationError(msg) 

       payload = jwt_payload_handler(user) 

       return { 
        'token': jwt_encode_handler(payload), 
        'user': user 
       } 
      else: 
       msg = _('Unable to login with provided credentials.') 
       raise serializers.ValidationError(msg) 
     else: 
      msg = _('Must include "{username_field}" and "password".') 
      msg = msg.format(username_field=self.username_field) 
      raise serializers.ValidationError(msg) 

Avec cela, je peux commencer remplaçant l'original, mais en quelque sorte l'objet de retour est toujours juste le jeton.

D'une certaine façon je ne pouvais pas trouver où il est généré, il ne semble que c'est à cause de

  return { 
       'token': jwt_encode_handler(payload), 
       'user': user 
      } 

Même avec cela, l'utilisateur n'est pas retourné seulement les jetons. J'ai même essayé de prendre le retour ensemble et ont return{} mais avec les informations d'identification droite, il retourne encore quelque chose comme {"token": null}

J'ai même essayé d'utiliser return Response({}) mais où est-il obtient le {"token": null} et pourquoi est-il pas montrer mon user object comme réponse cependant? J'ai utilisé print (user) et bien sûr il existe que c'est valide si

+0

S'il vous plaît écrivez ce que vous voulez archiver. – Raz

+0

@Raz Je veux retourner l'objet utilisateur et pas seulement le jeton – Dora

+0

Surcharger JSONWebTokenSerializer n'est pas ce que vous voulez. Vous devez utiliser votre propre gestionnaire de charge utile de réponse. Lisez @hairetdin réponse et acceptez-le comme une solution, parce que c'est. Je ne sais pas si son code fonctionne mais le principe est correct. – Silko

Répondre

2

Vous pouvez utiliser le paramètre supplémentaire - JWT_RESPONSE_PAYLOAD_HANDLER - pour retourner la clé et l'utilisateur dans la réponse json. Voir la documentation http://getblimp.github.io/django-rest-framework-jwt/, il y a un exemple d'utilisation de JWT_RESPONSE_PAYLOAD_HANDLER.

C'est mon exemple de code:

settings.py

JWT_AUTH = { 
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'back.views.jwt_response_payload_handler', 
} 

dans le dos/view.py

from rest_framework import serializers 
from django.contrib.auth.models import User 


class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id', 'username') 


def jwt_response_payload_handler(token, user=None, request=None): 
    return { 
     'token': token, 
     'user': UserSerializer(user, context={'request': request}).data, 
    } 
+0

de loin la version la plus succincte de ce que j'ai trouvé. Je garde cette réponse dans mes favoris :) –