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 я добавил функцию для аутентификации пользователя с помощью токена. Когда вызывается представление для аутентификации пользователя, я делаю следующее.

  1. Проверьте, существует ли токен.
  2. Получение пользователя ( AuthToken.user.username )
  3. Получить пароль пользователя ( AuthToken.user.password )
  4. Аутентифицируйте эти данные с помощью Django authenticate
  5. .

Я понимаю, что это определенно не удастся, поскольку пароль, полученный из 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')

Вернуться на верх