【问题标题】:How to make a correct password encryption in django users?如何在 django 用户中进行正确的密码加密?
【发布时间】: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

二。获取令牌问题

前置条件:

  1. 我通过 manage.py createsuperuser 创建了一个超级用户
  2. 我通过我的 api 端点创建了一个 testuser。

重现步骤:

  1. 为超级用户获取令牌。使用 TokenObtainPairView.as_view() 调用端点。不出所料,我成功拿到了令牌
  2. 为 testuser 获取令牌。

结果:为测试用户调用相同的端点以 401 错误“无法使用提供的凭据登录”结束。

预期结果:为 testuser 获取令牌。

我尝试使用JWT的几个库作为djangorestframework-jwt和djangorestframework_simplejwt(请不要推荐教程,这个没用,我几乎都试过了)

我发现了问题,我的超级用户的用户表中的密码是加密的,但对于我的简单测试用户 - 不是。

所以我有 99% 的把握,真正的问题是密码没有加密。请看一下,我的序列化程序调用了set_password() 方法。我希望它应该加密我的密码

您能帮我解决这些问题吗?

如果有帮助,我可以提供源码、使用教程等

【问题讨论】:

    标签: django django-rest-framework jwt


    【解决方案1】:

    您将实例保存在序列化程序的 create 方法中,这是不对的,因为视图中的 perform_create 方法对此负责。你应该做的是创建一个实例并返回它。您还应该设置一个密码并将其作为参数传递给create。您没有设置它,因为您还没有创建实例。这将是做你想做的事情的正确方法。

    from django.contrib.auth.hashers import make_password
    def create(self, validated_data):
                password = make_password(validated_data.pop('password'))
                return User.objects.create(password=password, **validated_data)
    

    【讨论】:

    • 谢谢!这正是我所需要的。密码加密现已修复,正如我所料,JWT 授权开始为测试用户工作
    猜你喜欢
    • 1970-01-01
    • 2022-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2017-10-17
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多