Django Вход в систему с помощью токена
Я разрабатываю проект Django, я создал API в том же проекте, так как другие инструменты должны иметь возможность использовать функции из этого проекта. Этот метод не работает, и мне нужен кто-то, кто делал подобное, чтобы помочь с более изысканным и безопасным методом или указать, где я делаю неправильно.
Когда пользователь зарегистрирован, я создаю токен доступа (md5 has) для этого пользователя и храню его в модели, каждый токен имеет внешний ключ пользователя.
class AuthToken(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
token = models.TextField()
created_date = models.DateField(auto_now_add=True)
created_time = models.TimeField(auto_now=True)
status = models.IntegerField(default=0)
В API я добавил функцию для аутентификации пользователя с помощью токена. Когда вызывается представление для аутентификации пользователя, я делаю следующее.
- Проверьте, существует ли токен.
- Получение пользователя ( AuthToken.user.username )
- Получить пароль пользователя ( AuthToken.user.password )
- Аутентифицируйте эти данные с помощью Django authenticate .
Я понимаю, что это определенно не удастся, поскольку пароль, полученный из AuthToken.user.password, будет зашифрованным, а передача зашифрованного пароля в Django для аутентификации зашифрует его и сравнит снова.
Ниже представлено мое представление аутентификации API
if module == 'auth': # authentication model queried
api_token = crud # api access token
token_filter = AuthToken.objects.filter(token=api_token) # filter for token existence
if token_filter.count() == 1: # if there is token
token_d = AuthToken.objects.get(token=api_token)
username = token_d.user.username
password = token_d.user.password
# login
user = authenticate(request, username=username, password=password)
try:
# check if user is valid
if hasattr(user, 'is_active'):
auth_login(request, user)
# Redirect to a success page.
return redirect('home')
else:
messages.error(request,
f"There is an error logging in, please check your credentials again or contact "
f"Administrator")
return redirect('login')
except Exception as e:
messages.error(request, f"There was an error {e}")
return redirect('login')
else:
return HttpResponse('INVALID TOKEN')
elif module == 'auth': # authentication model queried
api_token = crud # api access token
token_filter = AuthToken.objects.filter(token=api_token) # filter for token existence
if token_filter.count() == 1: # if there is token
token_d = AuthToken.objects.get(token=api_token)
username = token_d.user.username
password = token_d.user.password
# login
user = authenticate(request, username=username, password=password)
try:
# check if user is valid
if hasattr(user, 'is_active'):
auth_login(request, user)
# Redirect to a success page.
return redirect('home')
else:
messages.error(request,
f"There is an error logging in, please check your credentials again or contact "
f"Administrator")
return redirect('login')
except Exception as e:
messages.error(request, f"There was an error {e}")
return redirect('login')
else:
return HttpResponse('INVALID TOKEN')