Django: невозможно войти в систему после успешной регистрации

login сообщает о неправильном имени пользователя или пароле, после успешной регистрации нового пользователя. Я уверен, что здесь нет опечатки! Ниже приведен мой код, и я предполагаю, что проблема связана с хэш-кодом, связанным с установкой пароля?

@csrf_exempt
def api_register(request):
    data = json.loads(request.body)
    username = data['username']
    password_1 = data['password_1']
    password_2 = data['password_2']

    # 1,check if two pw is same
    if password_1 != password_2:
        return JsonResponse({"code": 0, "msg": "pw not consistant"})

    else:
        m = hashlib.md5()
        m.update(password_1.encode())
        password_m = m.hexdigest()

        # 2 check if username exists

        users = User.objects.filter(username=username)
        if users:
            return JsonResponse({"error": "username already exists"})
        else:
            try:
                user = User.objects.create_user(username = username, password = password_m)
                user.set_password(password_m)
                user.save()
                user.is_active = True
                user.success = True
                ret_data = {"username": user.username, 'uid': user.id, 'password': user.password}
                token = TimestampSigner(sep='.').sign_object(ret_data)
                ret_data['token'] = token
                ret = {"code": 1, "msg": ret_data}
            except Exception as e:
                print('--create user error is %s' % e)
                return JsonResponse({"error": "username already exists"})
            return JsonResponse(ret)

ниже приведена функция входа в систему

@csrf_exempt
def api_login(request):
    data = json.loads(request.body)
    user = authenticate(**data) #same as authenticate(username=data['username'],password=data['password']

    if user:
        ret_data = {"username":user.username,'uid':user.id}
        token = TimestampSigner(sep='.').sign_object(ret_data)
        ret_data['token'] = token
        ret = {"code":1,"msg":ret_data}
        print("ret ", ret)
    else:
        ret = {"code":0,"msg":"username or password wrong!" }
    return JsonResponse(ret)

Django's .set_password хэширует сам пароль, поэтому вам не следует делать это вручную. В этом случае аутентификация, конечно же, перестанет работать, поскольку введенный пароль не будет совпадать с MD5-хэшированием. Кроме того, MD5 не считается "безопасным" хэшером.

@csrf_exempt
def api_register(request):
    data = request.json()
    username = data['username']
    password_1 = data['password_1']
    password_2 = data['password_2']

    # 1 check if two pw is same
    if password_1 != password_2:
        return JsonResponse({'code': 0, 'msg': 'pw not consistant'})

    # 2 check if username exists
    if User.objects.filter(username=username).exists():
        return JsonResponse({'error': 'username already exists'})
    user = User.objects.create_user(
        username=username, password=password1, is_active=True, success=True
    )
    ret_data = {'username': user.username, 'uid': user.id, 'password': password1}
    token = TimestampSigner(sep='.').sign_object(ret_data)
    ret_data['token'] = token
    return JsonResponse({'code': 1, 'msg': ret_data})
Вернуться на верх