Django REST框架检查用户是否存在及密码

2 投票
2 回答
6540 浏览
提问于 2025-04-18 06:13

下面的代码是我现在用的,虽然它不是最安全的,但能完成任务。不过我想用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):

但是当我发送两个值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)

2 个回答

0

我实现了一个使用JWT登录的方法,它的工作流程是这样的:

  1. 首先,我获取请求中发送的邮箱和密码,并把它们转换成一个字符串变量。
  2. 接着,我检查这个邮箱是否已经存在于我创建的用户模型中。
  3. 如果用户已经存在,我会把这个用户对象转换成字典,这样我就能获取到对应的密码。
  4. 然后,我会把用户模型中的密码和请求中发送的密码进行比对。
  5. 如果邮箱在用户模型中存在,并且对应的密码和请求中发送的密码匹配,我就会使用pyJWT生成一个包含我自定义数据的JWT,并返回响应。
  6. 在其他情况下,如果邮箱和密码不匹配,我会返回“No Match”。

假设请求是 {"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'})
3

模型是用户还是User?为什么不直接用Django的User模型呢?

User类已经有一个检查密码的方法,并且用一种叫做哈希算法的方式来存储密码: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

撰写回答