关于Django obtain_jwt_token (authenticate自动验证)获取token返回bad request 400的原因

关于Django obtain_jwt_token (authenticate自动验证)获取token返回bad request 400的原因

首先JWT obtain_jwt_token 签发token需要引用django的authenticate()方法,所以问题一般是出在authenticate()
1.普遍都是数据库内的用户名和密码与登陆的用户密码不一致。
1.1一种是创建用户时用create()创建或直接手动录入数据,这种方法会导致出入数据库的密码是明文的,authenticate()验证不了明文密码(因为authenticate()验证的是加密过的密码),存入时使用User.objects.create_user()或者使用check_password()对密码加密。具体怎么做其他博文有写,可以看看。

1.2另一种是比较傻的错误(就是我,搞得我炸裂),由于设置model里面的User表的password字段max_length=50!!!。正常思维一般的密码也不会那么长对吧,想着50长度怎么都够用了(个人项目)。但是由于上面authenticate()需要验证加密的password,所以就不好说了。存入的password经过加密,包括使用python manage.py createsuperuser创建的超级用户的密码也是经过加密的。所以你会发现超级用户也登陆不了。加密过的密码在存入时django会发出一个警告**"Data truncated for column ‘password’ at row 1**,这就说明password只存入了一部分并没有全部存入数据库。所以就导致登陆的密码与数据库取出来解密后的密码不一致的问题,导致登陆失败。只要设置max_length=255,就OK了(男的女的折磨,菜是原罪。。。)

2.就是django2.1 版本后authenticate()还会验证is_active,在setting文件里面加上AUTHENTICATION_BACKENDS =[‘django.contrib.auth.backends.AllowAllUsersModelBackend’],取消自动验证与is_active的关联。或者在User里重写is_active字段,is_active = models.BooleanField(blank=True, default=True),默认为true即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值