将身份验证令牌添加到UserSerializer

时间:2013-05-02 09:44:38

标签: django django-rest-framework

如何将身份验证令牌添加到userSeralizer?

这是我的序列化器:

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

然后在我看来的网址:

@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 个答案:

答案 0 :(得分:1)

从安全角度来看,不应在序列化程序中传递auth令牌。如果任何人都可以看到您的用户视图,那么任何人都可以毫无困难地冒充任何用户。

只有在成功登录后才会返回令牌,而不是在创建用户时返回。这就是大多数网站要求用户在帐户创建后立即登录的原因。


但是为了这个问题,有几种方法可以向序列化程序添加项目。

首先,有点hacky但不需要自定义模型

# 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)

最后但并非最不重要的是,它更优雅但需要自定义User类。但是,您可以在您的应用模型中使用它。

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

然后在序列化程序类中添加带有标记的字段(记得将它添加到元类的fields属性中)

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

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