我如何使用其他字段来获取 jwt 令牌

问题描述

我使用https://django-rest-framework-simplejwt.readthedocs.io/en/latest/

我有这样的代码

User = get_user_model()

class Profile(models.Model):
    user = models.OnetoOneField(User,on_delete=models.CASCADE)
    bio = models.TextField()
    ROLE_CHOICES = [
        ('U','User'),('M','Moderator'),('A','Admin'),]
    role = models.CharField(max_length=1,choices=ROLE_CHOICES,default='U')
    confirmation_code = models.CharField(max_length=30)

我想获得 JWT 令牌,这是我的网址

path("v1/token/",views.EmailTokenObtainPairView.as_view(),name="token_obtain_pair")

我需要发送这样的 POST 查询

http://127.0.0.1:8000/api/v1/token/

有数据:

{ 'email': email,'confirmation_code': confirmation_code }

认情况下,在 simple-jwt 中我需要发送数据:

{'username' : username,'password':password }

在我的 serializer.py 中

class CustomTokenObtainPairserializer(TokenObtainPairserializer):
    username_field = User.EMAIL_FIELD

在我的views.py中

class EmailTokenObtainPairView(TokenObtainPairView):
    serializer_class = CustomTokenObtainPairserializer

我已经更改了电子邮件中的用户名,但是我无法在confirmation_code 上更改密码

如何更改认方式?

解决方法

您可以覆盖 TokenObtainSerializer 进行自定义。

对于您的情况,您需要自定义方法 d1 = {'a': 5,'b': 8,'c': 5} d2 = {'a': 9,'b': 4,'c': 7} d = {k:min(v,d2[k]) for k,v in d1.items()} print(d) # {'a': 5,'c': 5} 。有关详细信息,请参阅此链接 https://django-rest-framework-simplejwt.readthedocs.io/en/latest/customizing_token_claims.htmlhttps://github.com/SimpleJWT/django-rest-framework-simplejwt/blob/c684e8396f8446cc289ed73a0740ca222c85470d/rest_framework_simplejwt/serializers.py#L20