关于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即可。