Вход в систему по электронной почте: функция аутентификации не работает
def EmailLoginVerify(request):
if request.method == 'POST':
if 'token' in request.POST:
try:
submitted_token = int(request.POST['token'])
except ValueError:
return HttpResponse('Invalid token format', status=400)
if submitted_token == request.session.get('login_token'):
email = request.session.get('email')
try:
target = MyUser.objects.get(email=email)
print('user is', target.username, 'and password is', target.password)
#export:
#>>>>>>>user is maziar and password is pbkdf2_sha256$720000$CY5sjiqAL1yScKzGhzYBp9$2tUx8ScBbbuZlj+u0YfMxwTIRfz5Vfmv+58piWCAjKM=
except MyUser.DoesNotExist:
return HttpResponse('User Not Found', status=404)
user = authenticate(request, username=target.username, password=target.password)
print(user)
#export:
#>>>>> None
if user is not None:
login(request, user)
return HttpResponse('good')
else:
return HttpResponse('Authentication failed', status=401)
else:
return HttpResponse('Invalid token', status=403)
else:
return HttpResponse('Token not provided', status=400)
else:
return render(request, 'login_verify.html')
в конце он возвращает 'Authrntication Failed'. этот код получает email от пользователя, если пользователь с таким email существует, он отправляет код на email и если пользователь вводит правильный код, он должен аутентифицировать пользователя и войти в систему, но он возвращает 'Authentication Failed'
введите описание изображения здесь
Когда вы пытаетесь аутентифицировать пользователя с помощью имени пользователя и пароля из базы данных, вы передаете хэшированный пароль непосредственно в функцию authenticate
. Однако функция Django authenticate
ожидает необработанный пароль (не хэшированный), и она будет хэшировать его внутри, чтобы сверить с хэшем, хранящимся в базе данных.
Поскольку вы пытаетесь аутентифицировать пользователя с помощью хэшированного пароля, аутентификация не удалась.
Вы не можете напрямую аутентифицировать пользователя с помощью стандартного метода authenticate
, поскольку на этом этапе пользователь не предоставил свой пароль. Возможно, вам стоит рассматривать этот процесс как отдельный шаг проверки, на котором вы входите в систему после проверки токена, не требуя ввода пароля.
def EmailLoginVerify(request):
if request.method == 'POST':
if 'token' in request.POST:
try:
submitted_token = int(request.POST['token'])
except ValueError:
return HttpResponse('Invalid token format', status=400)
if submitted_token == request.session.get('login_token'):
email = request.session.get('email')
try:
target = MyUser.objects.get(email=email)
print('user is', target.username, 'and password is', target.password)
except MyUser.DoesNotExist:
return HttpResponse('User Not Found', status=404)
# Bypass password authentication after successful token verification
login(request, target)
return HttpResponse('good')
else:
return HttpResponse('Invalid token', status=403)
else:
return HttpResponse('Token not provided', status=400)
else:
return render(request, 'login_verify.html')
Надеюсь, это немного поможет вам.