2017-01-26 4 views
1

я нашел в Интернете, что мы можем переопределить JSONWebTokenSerializer, имея это в нашем URL url(r'^login/', ObtainJSONWebToken.as_view(serializer_class=CustomJWTSerializer)), и с точки зрения у меня естьЗачем отменять перезагрузку JSONWebTokenSerializer сохраняет только возвращаемый токен? питон

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) 

С этим, я могу начать перекрывая оригинал, но каким-то образом возвращение объект всегда просто токен.

Как-то я не мог найти, где это генерируется, это выглядит, как будто это из-за

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

Даже с этим, пользователь не будет возвращен только маркеры. Я даже пытался вынимая всю отдачу и имеют return{}, но с правом верительных, она по-прежнему возвращает что-то вроде {"token": null}

Я даже попытался использовать return Response({}), но все же, где это получение {"token": null} от и почему он не показывает мою user object как ответ хотя? Я использовал print (user) и наверняка существует, что он действителен, хотя

+0

Пожалуйста, напишите, что вы хотите архивировать. – Raz

+0

@Raz Я хочу вернуть объект пользователя не только токен – Dora

+0

Переопределение JSONWebTokenSerializer - это не то, что вы хотите. Вам нужно использовать собственный обработчик полезной нагрузки. Прочтите ответ @hairetdin и примите его как решение, так оно и есть. Я не уверен, работает ли его код, но принцип верен. – Silko

ответ

2

Вы можете использовать дополнительную настройку - JWT_RESPONSE_PAYLOAD_HANDLER - вернуть ключ и пользователя в ответ json. См. Документацию http://getblimp.github.io/django-rest-framework-jwt/, есть пример использования JWT_RESPONSE_PAYLOAD_HANDLER.

Это мой пример кода:

settings.py

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

в спине/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

безусловно самая краткая версия этого, что я нашел. Я сохраняю этот ответ в своих записях :) –

Смежные вопросы