Django休息框架检查用户是否存在密码

时间:2014-05-11 17:46:02

标签: python django django-rest-framework

我正在向你展示它现在对我有用的代码。它不是最安全但是工作但我想用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时,它表示该缺口已经存在并返回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 :(得分:0)

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

类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继承并在发布方法中实现您的代码:http://www.django-rest-framework.org/api-guide/views

答案 1 :(得分:0)

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

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

假设请求为{“ email”:“ xyz@gmail.com”,“ password”:“ 12345”}

minio.error.SignatureDoesNotMatch: SignatureDoesNotMatch: message: The request signature we calculated does not match the signature you provided.