【问题标题】:JWT authentication customisation with phone_number and password instead of username and password使用电话号码和密码而不是用户名和密码来自定义 JWT 身份验证
【发布时间】:2021-08-18 19:39:06
【问题描述】:

我已经在我的项目中使用链接https://django-rest-framework-simplejwt.readthedocs.io/en/latest/index.html实现了JWT认证和授权

代码运行良好,但我需要将“用户名”和“密码”更改为“手机号码”和“OTP”。

我有一个自定义用户模型,例如

class User(AbstractUser):
  password = models.CharField(max_length=128, blank=True, null=True)
  email = models.EmailField(max_length=254, unique=True)
  dial_code_id = models.CharField(max_length=100)
  mobile_number = models.CharField(max_length=100, blank=True, null=True)
  username = models.CharField(max_length=150, unique=True, blank=True, null=True)
  is_resource = models.BooleanField(default=False)
  is_customer = models.BooleanField(default=False)
  is_active = models.BooleanField(default=True)
  skills = models.ManyToManyField(Skills)

  class Meta:
      db_table = "my_user"

  def __str__(self):
      return self.mobile_number

出于登录目的,我打算有一个类似的 otp 模型

class LoginOtp(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE)
  otp = models.IntegerField()
  created_on = models.DateTimeField(default=datetime.utcnow())

  class Meta:
    db_table = "otp"
  1. 我不知道上述方法是否是正确的方法。如果不是,请纠正我。
  2. 如何将“username”和“password”替换为“mobile_number”和“otp”。

谢谢。

【问题讨论】:

    标签: django django-rest-framework django-rest-auth django-rest-framework-jwt django-rest-framework-simplejwt


    【解决方案1】:

    首先,创建一个视图来接受用户的mobile_number。验证它是否存在于您的 User 模型中,如果存在,则使用 Twilio 等消息传递 API 服务发送 OTP。如果mobile_number 不存在,则相应地通知用户。

    此外,您还需要另一个端点来验证 OTP 用户是否已收到。这也可以使用相同的消息传递 API 服务 Twilio 来完成。一旦 Twilio 验证了 OTP,您就可以使用这个简单的 JWT 生成像这样的 refreshaccess 令牌 -

    from rest_framework_simplejwt.tokens import RefreshToken
    
    #generate refresh token and access token.
    token = RefreshToken.for_user(user)
    

    for_user() 方法将接受User 模型的实例。在您的情况下,是刚刚验证 OTP 的用户。

    如果 OTP 验证成功,您可以返回这样的响应 -

    {
       "refresh":str(token),
       "access": str(token.access_token)
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-30
      • 2019-03-15
      • 2020-10-10
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 2021-11-07
      • 2019-11-02
      • 1970-01-01
      相关资源
      最近更新 更多