我的应用程序不需要密码,因为我想用手机和OTP登录。我正在尝试实现自定义的简单JWT令牌身份验证,它只需要一个电话号码而不需要密码。我是Django的新手,我检查了stackoverflow中的一些链接并尝试了这个:
class CustomSerializer(TokenObtainPairSerializer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields[self.username_field] = serializers.CharField()
del self.fields['password']
def validate(self,attr):
print(attr)
data = super().validate(attr)
token = self.get_token(self.user)
print (token)
try:
request = self.context["request"]
print(request)
except KeyError:
pass
request_data = json.loads(request.body)
print(request_data)
所以这里当validate方法被执行时,它去validate TokenObtainPairSerializer
init方法,该方法返回调用它的父类的init方法,该方法验证密码。因此,即使我在我的自定义序列化程序中删除密码字段,它仍然会给我一个密码键错误。我试图通过键错误,但它再次在request.body
失败。
我被困在这里,我不知道如何实现简单的JWT没有密码。
1条答案
按热度按时间wmomyfyw1#
我也有同样的问题,在大量的搜索和阅读django-rest-framework-simplejwt的源代码后,我得到了答案。
因此,即使我在我的自定义序列化程序中删除passowrd字段,它仍然会给我给予密码的密钥错误
如果你看一下
TokenObtainSerializer
类,它是TokenObtainPairSerializer
的父Serializer,你可以看到密码是这样调用的:因此,即使您删除了密码字段,稍后仍会调用它。
我所做的是将密码字段设置为不需要,并指定一个空字符串作为密码。
现在可以在视图中使用此序列化程序。
然后我创建了一个自定义身份验证后端,这样用户就可以在没有密码的情况下进行身份验证。
您可以阅读文档以了解有关创建自定义身份验证后端的更多信息。
最后,在
settings.py
上更改AUTHENTICATION_BACKENDS
变量。现在Django将尝试使用第一个身份验证
ModelBackend
进行身份验证,然后使用新的AuthenticationWithoutPassword
进行身份验证。这里只是说显而易见的,但请记住,没有密码的身份验证肯定是不安全的,所以你应该在你的自定义身份验证中添加更多的逻辑,记住你可以访问
request
变量。