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})