【问题标题】:Django rest framework check if user exist with passwordDjango rest框架检查用户是否存在密码
【发布时间】:2020-06-29 17:46:03
【问题描述】:

我在下面向您展示的代码现在对我有用。它不是最安全的,但可以完成这项工作,但我想使用 POST 方法来完成。任何想法如何改变它?

我有一个 serializer.py 类

class userLoginSerializer(serializers.ModelSerializer):

class Meta:
    model = users
    fields = ('nick', 'pass_field')


@api_view(['GET'])
def user_login(request,nick,pass_field):

但是当我发送 2 个值 nick 和 passfield 时,它说 nick 已经存在并返回 404,因为它将它传递给 serializers.errors。我只需要使用 POST 传递代码并验证它是否存在并返回成功的 JSON。下面的代码有效,但它不是最好的实现。

if request.method == 'GET':

    try: 

        users.objects.get(nick=nick,pass_field=pass_field)
        json = {}
        json['message'] = 'success'

        return Response(json, status=status.HTTP_201_CREATED)

    except users.DoesNotExist:

        json = {}
        json['message'] = 'error'

        return Response(json, status=status.HTTP_400_BAD_REQUEST)

【问题讨论】:

  • 您是否将密码存储为纯文本?不好。无论如何,POST 带有用户名和密码的请求看起来很像身份验证。请告诉我们更多关于您为什么首先提出请求。也许有更好的方法来解决您的问题。
  • iOS 应用程序将 nick 和 pass_field 值发送到 API。它必须检查它们是否在数据库中并在任何一种情况下返回成功、错误消息。我正在使用 request.DATA['nick'] 使用 POST 但仍然无法验证字段:( 就像 serializer.data 一样。

标签: python django django-rest-framework


【解决方案1】:

模型是用户还是用户?为什么不使用 Django User 模型?

User 类已经有一个 check_password 方法并用哈希算法存储它:https://docs.djangoproject.com/en/dev/ref/contrib/auth/#methods 永远不要以纯文本形式存储密码,这是非常不安全的。

使用 Django User 模型(或继承自它的类),您可以通过这种方式简单地检查它是否有效:

try:
   user = User.objects.get(username=nick)
   if user.check_password(pass_field):
      #TODO: Valid password, insert your code here
   else:
      #TODO: Password not valid, handle it here
      pass
except User.DoesNotExist:
   #TODO: Your error handler goes here
   pass

您可以做的另一件事是从 ApiView 继承并在 post 方法中实现您的代码:http://www.django-rest-framework.org/api-guide/views

【讨论】:

    【解决方案2】:

    我实现了一个使用 JWT 登录的方法,它的作用是:

    1. 获取随请求发送的电子邮件和密码,并 将其转换为字符串变量
    2. 我检查电子邮件是否已经 存在于我制作的自定义用户模型中。
    3. 如果用户已经 存在,我将对象模型转换为字典,以便我可以得到 它的特定密码。
    4. 因为我匹配密码 对应于用户模型和与发送的密码 发布请求。
    5. 如果用户模型中存在电子邮件,并且与该用户模型对应的密码与发布请求发送的密码匹配,我使用 pyJWT 使用我的自定义数据创建 JWT 并返回响应。
    6. 在所有其他情况下,电子邮件和密码不匹配,我返回“不匹配”

    假设请求是 {"email":"xyz@gmail.com", "password":"12345" }

        @api_view(['POST'])
        def signin(request):
    
        email = list(request.data.values())[0] #gets email value from post request {"email":"xyz@gmail.com", "password":"123"} -> this xyz@gmail.com
        password = list(request.data.values())[1] #gets password value from post request {"email":"xyz@gmail.com", "password":"123"} -> this 123
    
        usr = User.objects.filter(email=email).exists() #checks if email exists
        if usr:
          dictionary = User.objects.filter(email=email).values()[0] #converts object to dictionary for accessing data like dictionary["password"] dictionary["first_name"] etc
          if usr and dictionary["password"] == password: #check if email and its corresponing password stored matches the password that is sent
            branch = dictionary["branch"]
            id = dictionary["id"]
            encoded_jwt = jwt.encode({'email': email,}, 'secret', algorithm='HS256')
            return Response({'token':encoded_jwt,'email':email,'branch':branch,'id':id})
          else: 
            return Response({'No Match'})
        return Response({'No Match'})
    

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 2022-07-22
      • 1970-01-01
      • 2020-12-16
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      相关资源
      最近更新 更多