【发布时间】:2019-12-21 09:38:09
【问题描述】:
我想学习如何在 Django 中使用 JSON web-token 授权。
我是 django 的新手,所以我找到了几个教程并完全按照它们一步一步来。
我的应用中有用户模型:
class User(AbstractUser):
username = models.CharField(max_length=10, unique=True)
email = models.EmailField(_('email address'), unique=True)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email', 'first_name', 'last_name']
def __str__(self):
return "{}".format(self.email)
我还有一个序列化器:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['url', 'email', 'username', 'first_name', 'last_name', 'password']
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
password = validated_data.pop('password')
user = User(**validated_data)
user.username = validated_data.get('username')
user.set_password(password)
user.save()
return user
请在此处查看user.set_password(password)。
然后我有一个用于创建令牌的 api 端点,另一个用于为我的用户处理 POST 请求的端点。这里没什么特别的。
问题是 JWT 授权不像我预期的那样工作:
问题描述:
我。用户密码加密。
我将 JSON 发送到我的 api 端点的 POST 方法以创建用户
预期结果:创建测试用户并以加密方式存储密码
pbkdf2_sha256$150000$mE9jeTnJdBds$X6VtRY0HKM4o4by4PzWNxtgKb8NL1mZg4W5M+y4Ohb0=
实际结果:测试用户已创建,密码以非加密方式存储。
123456
二。获取令牌问题
前置条件:
- 我通过 manage.py createsuperuser 创建了一个超级用户
- 我通过我的 api 端点创建了一个 testuser。
重现步骤:
- 为超级用户获取令牌。使用 TokenObtainPairView.as_view() 调用端点。不出所料,我成功拿到了令牌
- 为 testuser 获取令牌。
结果:为测试用户调用相同的端点以 401 错误“无法使用提供的凭据登录”结束。
预期结果:为 testuser 获取令牌。
我尝试使用JWT的几个库作为djangorestframework-jwt和djangorestframework_simplejwt(请不要推荐教程,这个没用,我几乎都试过了)
我发现了问题,我的超级用户的用户表中的密码是加密的,但对于我的简单测试用户 - 不是。
所以我有 99% 的把握,真正的问题是密码没有加密。请看一下,我的序列化程序调用了set_password() 方法。我希望它应该加密我的密码
您能帮我解决这些问题吗?
如果有帮助,我可以提供源码、使用教程等
【问题讨论】:
标签: django django-rest-framework jwt