首页 文章

在Django休息框架登录后获取JWT令牌

提问于
浏览
0

我不确定我是否理解正确 . 我正在使用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 回答

  • 0

    你不应该这样做,因为django-rest-framework JWT为你管理所有的令牌 .

    只需:

    from rest_framework_jwt.views import obtain_jwt_token
    
    urlpatterns = [
        # ...
    
        url(r'^api-token-auth/', obtain_jwt_token),
    ]
    

    你将被允许获得JWT .

    此外,您可以在创建/登录用户在settings.py文件中指定JWT_PAYLOAD_HANDLER后设置自定义用户有效负载 .

相关问题