如何将身份验证令牌添加到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)
我认为在序列化程序中使用令牌会不会很好?
答案 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')