我在我的应用程序中使用django-rest-jwt进行身份验证.
默认情况下,用户用户名字段用于验证用户,但我希望让用户使用电子邮件或用户名登录.
django-rest-jwt是否有任何支持来实现此目的.我知道最后一个选项是编写我自己的登录方法.
无需编写自定义身份验证后端或自定义登录方法.
自定义序列化程序继承JSONWebTokenSerializer,重命名'username_field'并覆盖def validate()方法.
这适用于'username_or_email'和'password'字段,用户可以在其中输入用户名或电子邮件,并获取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)),