我不确定我是否理解正确 . 我正在使用Django Rest Framework让用户登录(显然还有许多其他事情) . 用户在我的案例中从IOS App登录后,我想获得一个令牌并从那里开始使用令牌,因此只要令牌有效,他们只需要登录一次 .
我得到了两个部分,使用用户名或电子邮件登录,以及使用curl的get令牌(如JWT手册中所示) .
如何将两者结合起来,所以如果登录成功,在登录响应之前,我将调用JWT,创建令牌然后将其返回到登录的响应,应用程序将获得带有响应的令牌 .
我不确定是否应该这样做,我想在一次API调用中完成,而不是两次 . 两个看起来很简单,但任何不需要的电话都不应该在我的眼中完成 .
class UserLoginSerializer(ModelSerializer):
user_id = IntegerField(read_only=True)
token = CharField(allow_blank=True, read_only=True)
username = CharField(required=False, allow_blank= True)
email = EmailField(label='Email Address', required=False, allow_blank= True)
class Meta:
model = User
fields = [
'user_id',
'username',
'email',
'password',
'token',
]
extra_kwargs = {"password": {"write_only": True}}
def validate(self, data):
user_obj = None
email = data.get("email", None)
username = data.get("username", None)
password = data["password"]
if not email and not username:
raise ValidationError("A username or email is required to login.")
user = User.objects.filter(
Q(email=email) |
Q(username=username)
).distinct()
user = user.exclude(email__isnull=True).exclude(email__iexact='')
if user.exists() and user.count() == 1:
user_obj = user.first()
else:
raise ValidationError("This username/email is not valid!")
if user_obj:
if not user_obj.check_password(password):
raise ValidationError("Incorrect credentials, please try again!")
data["token"] = "SOME RANDOM TOKEN"
data["user_id"] = user_obj.id
return data
我正在返回数据中的令牌,所以我需要的是在此之前从JWT获取令牌然后像我在这里一样返回数据的方法 .
谢谢
1 回答
你不应该这样做,因为django-rest-framework JWT为你管理所有的令牌 .
只需:
你将被允许获得JWT .
此外,您可以在创建/登录用户在settings.py文件中指定JWT_PAYLOAD_HANDLER后设置自定义用户有效负载 .