2

如何将身份验证令牌添加到 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)

我认为将令牌放在序列化程序中会很好,或者不是?

4

1 回答 1

4

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

令牌仅在成功登录后返回,而不是在创建用户时返回。这就是为什么大多数网站要求用户在创建帐户后立即登录。


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

首先,有点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)

然后在序列化程序类中添加带有令牌的字段(记住将其添加到元类中的字段属性)

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

    class Meta:
        model = User
        fields = ('id', 'username', 'token')
于 2013-10-05T22:57:26.887 回答