gpt4 book ai didi

Django Rest JWT 使用用户名或电子邮件登录?

转载 作者:行者123 更新时间:2023-12-01 23:35:51 25 4
gpt4 key购买 nike

我在我的应用程序中使用 django-rest-jwt 进行身份验证。

默认情况下,它通过用户用户名字段来验证用户,但我想让用户使用电子邮件或用户名登录。

django-rest-jwt 支持任何方法来完成此任务吗?我知道最后一个选项是编写我自己的登录方法。

最佳答案

无需编写自定义身份验证后端或自定义登录方法。

继承 JSONWebTokenSerializer 的自定义序列化器,重命名“username_field”并重写 def validate() 方法。

这非常适合“用户名或电子邮件”和“密码”字段,用户可以在其中输入用户名或电子邮件并获取 JSONWebToken 以获得正确的凭据。

from rest_framework_jwt.serializers import JSONWebTokenSerializer

from django.contrib.auth import authenticate, get_user_model
from django.utils.translation import ugettext as _
from rest_framework import serializers

from rest_framework_jwt.settings import api_settings


User = get_user_model()
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
jwt_decode_handler = api_settings.JWT_DECODE_HANDLER
jwt_get_username_from_payload = api_settings.JWT_PAYLOAD_GET_USERNAME_HANDLER

class CustomJWTSerializer(JSONWebTokenSerializer):
username_field = 'username_or_email'

def validate(self, attrs):

password = attrs.get("password")
user_obj = User.objects.filter(email=attrs.get("username_or_email")).first() or User.objects.filter(username=attrs.get("username_or_email")).first()
if user_obj is not None:
credentials = {
'username':user_obj.username,
'password': password
}
if all(credentials.values()):
user = authenticate(**credentials)
if user:
if not user.is_active:
msg = _('User account is disabled.')
raise serializers.ValidationError(msg)

payload = jwt_payload_handler(user)

return {
'token': jwt_encode_handler(payload),
'user': user
}
else:
msg = _('Unable to log in with provided credentials.')
raise serializers.ValidationError(msg)

else:
msg = _('Must include "{username_field}" and "password".')
msg = msg.format(username_field=self.username_field)
raise serializers.ValidationError(msg)

else:
msg = _('Account with this email/username does not exists')
raise serializers.ValidationError(msg)

在 urls.py 中:

url(r'{Your url name}$', ObtainJSONWebToken.as_view(serializer_class=CustomJWTSerializer)),

关于Django Rest JWT 使用用户名或电子邮件登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34332074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com