DRF 简单 jwt 从用户实例获取身份验证令牌或更改用户名和密码组合
DRF simple jwt getting auth token from a user instance OR change username and password combination
我有一个聊天应用程序,它使用与 WhatsApp 中相同的身份验证方法。
通常我会得到 jwt 授权令牌:
from rest_framework_simplejwt.views import TokenObtainView
path('api/token/', TokenObtainView.as_view(), name='token_obtain_pair'),
然而,当我的用户模型使用 phone_number 和验证码时,这会要求输入用户名和密码。有什么办法可以改变吗?
用户名======> phone_number
密码======> phone_code(验证码)
第二种方式
是传递用户实例并以某种方式从中获取身份验证令牌
我的登录视图
@api_view(['POST',])
def loginuser(request):
if request.method == 'POST':
phone_number = request.data.get('phone_number')
try:
user = User.objects.get(phone_number=phone_number)
if int(request.data.get('phone_code')) == user.phone_code and user.phone_code:
# user.phone_code = None
# user.save()
return Response({'phone_number': phone_number}, status.HTTP_200_OK)
else:
return Response({'error': "Invalid code"}, status.HTTP_400_BAD_REQUEST)
except Exception as error:
return Response({'error': error}, status.HTTP_500_INTERNAL_SERVER_ERROR)
我的用户模型:
class User(AbstractUser):
phone_number = PhoneNumberField(unique=True)
username = models.CharField(max_length=30)
password = models.CharField(null=True, blank=True, max_length=20)
about = models.CharField(
max_length=190, default="Hi, I use Orgachat!", blank=True, null=True)
...
phone_code = models.IntegerField(blank=True, null=True)
USERNAME_FIELD = 'phone_number'
def __str__(self):
return str(self.username)
# Save auth token, I know this should be in signals.py but whatever
@receiver(post_save, sender=User)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
我认为最好编写自定义后端 class 并将其添加到 Django,这是为了允许不同的身份验证方式,see
此外,您可以从 TokenObtainView
继承并在那里添加您的逻辑并使用此自定义 class 代替,但我更喜欢将第一个选项与 JWT 集成,因此您需要阅读文档和看看它是如何工作的。
我刚刚意识到 django-rest-framework-jwt
标签在那里,你应该放弃使用这个包,因为它是 unmaintained, use django-rest-framework-simplejwt 而不是
from rest_framework_simplejwt.tokens import RefreshToken, SlidingToken, UntypedToken
from django.conrtib.auth.models import User
user = User.objects.first()
SlidingToken.for_user(user)
RefreshToken.for_user(user)
str(RefreshToken.for_user(user))
str(RefreshToken.for_user(user).access_token)
您可以使用它从用户实例中获取用户 jwt 令牌。希望这对你有用。
我有一个聊天应用程序,它使用与 WhatsApp 中相同的身份验证方法。
通常我会得到 jwt 授权令牌:
from rest_framework_simplejwt.views import TokenObtainView
path('api/token/', TokenObtainView.as_view(), name='token_obtain_pair'),
然而,当我的用户模型使用 phone_number 和验证码时,这会要求输入用户名和密码。有什么办法可以改变吗?
用户名======> phone_number 密码======> phone_code(验证码)
第二种方式 是传递用户实例并以某种方式从中获取身份验证令牌我的登录视图
@api_view(['POST',])
def loginuser(request):
if request.method == 'POST':
phone_number = request.data.get('phone_number')
try:
user = User.objects.get(phone_number=phone_number)
if int(request.data.get('phone_code')) == user.phone_code and user.phone_code:
# user.phone_code = None
# user.save()
return Response({'phone_number': phone_number}, status.HTTP_200_OK)
else:
return Response({'error': "Invalid code"}, status.HTTP_400_BAD_REQUEST)
except Exception as error:
return Response({'error': error}, status.HTTP_500_INTERNAL_SERVER_ERROR)
我的用户模型:
class User(AbstractUser):
phone_number = PhoneNumberField(unique=True)
username = models.CharField(max_length=30)
password = models.CharField(null=True, blank=True, max_length=20)
about = models.CharField(
max_length=190, default="Hi, I use Orgachat!", blank=True, null=True)
...
phone_code = models.IntegerField(blank=True, null=True)
USERNAME_FIELD = 'phone_number'
def __str__(self):
return str(self.username)
# Save auth token, I know this should be in signals.py but whatever
@receiver(post_save, sender=User)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
我认为最好编写自定义后端 class 并将其添加到 Django,这是为了允许不同的身份验证方式,see
此外,您可以从 TokenObtainView
继承并在那里添加您的逻辑并使用此自定义 class 代替,但我更喜欢将第一个选项与 JWT 集成,因此您需要阅读文档和看看它是如何工作的。
我刚刚意识到 django-rest-framework-jwt
标签在那里,你应该放弃使用这个包,因为它是 unmaintained, use django-rest-framework-simplejwt 而不是
from rest_framework_simplejwt.tokens import RefreshToken, SlidingToken, UntypedToken
from django.conrtib.auth.models import User
user = User.objects.first()
SlidingToken.for_user(user)
RefreshToken.for_user(user)
str(RefreshToken.for_user(user))
str(RefreshToken.for_user(user).access_token)
您可以使用它从用户实例中获取用户 jwt 令牌。希望这对你有用。