2013-05-02 2 views
1

인증 토큰을 userSeralizer에 어떻게 추가합니까? 내보기에UserSerializer에 인증 토큰 추가

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

그리고 다음 URL : 나는 시리얼에 토큰을 가지고 여부 좋을 것이라고 생각

@api_view(['POST', 'DELETE']) 
def create_user(request): 
    """ 
    API endpoint to register a new user 
    """ 
    model = User 
    serializer_class = UserSerializer 
    username, password = request.POST['username'], request.POST['password'] 

    try: 
     user = User.objects.create_user(username, username, password) 
    except IntegrityError: 
     user = User.objects.get(username=username, email=username) 
    # the users token, we will send this to him now. 
    token = Token.objects.get(user=user) 

    if request.method == "POST": 
     serializer = UserSerializer(user) 
     return Response(data) 

이 내 시리얼입니까?

답변

1

보안 측면에서 볼 때, 인증 토큰은 시리얼 라이저에서 전달되어서는 안됩니다. 누구든지 사용자보기를 볼 수 있다면 아무도 큰 문제없이 모든 사용자를 가장 할 수 있습니다.

토큰은 사용자가 만들어 질 때가 아니라 로그인에 성공한 후에 만 ​​반환됩니다. 따라서 대부분의 사이트에서는 계정을 만든 직후 사용자가 로그인해야합니다.


그러나 질문을 위해서, 항목을 serializer에 추가하는 몇 가지 방법이 있습니다. 먼저

는 조금 해키하지만 사용자 정의 모델

# Not adding context would raise a DeprecationWarning in the console 
serializer = UserSerializer(user, context={'request': request}) 
data = serializer.data 
data['token'] = token 

return Response(data) 

마지막으로 필요하지 않은, 좀 더 우아하지만 사용자 정의 사용자 클래스가 필요합니다. 그러나 앱 모델에서 사용할 수 있습니다. 내가 "수익을 생각하지만

# in models.py inside your User model 
def get_my_token(self): 
    return Token.objects.get(user=user) 
my_token = property(get_my_token) 

다음 시리얼 클래스의 토큰으로 필드를 추가,

class UserSerializer(serializers.ModelSerializer): 
    token = serializers.Field(source='my_token') 

    class Meta: 
     model = User 
     fields = ('id', 'username', 'token') 
+0

멋진 답변 감사합니다 :) (필드에 추가하는 것을 기억하여 메타 클래스의 속성) Token.objects.get (user = self) "가 더 정확할 것입니다. – bpipat

+0

이것은 TypeError : 이 JSON을 직렬화 할 수없는 것 같습니다. 어떤 아이디어를 수정하는 방법? – dylan7