Как проверить хэшированные пароли Django в приложении FastAPI

Итак, у меня есть проект Python на Django, и я пытаюсь изменить его на FastAPI. Пароли в базе данных уже хешированы (я использую ту же базу данных из проекта Django), пароли в базе данных начинаются с pbkdf2_sha256$260000$.

Я пытаюсь выполнить функцию входа в систему, но у меня возникают проблемы с паролем.

Я получаю ошибку:

 "raise exc.UnknownHashError("hash could not be identified")
passlib.exc.UnknownHashError: hash could not be identified"

Когда я вставляю имя пользователя и пароль в форму входа fastapi.

#Security config
security = HTTPBasic()
pwd_context = CryptContext(schemes=["pbkdf2_sha256"], deprecated="auto")


async def login(request: Request):
    form = await request.form()
    username = form.get("username")
    password = pwd._context(form.get("password"))
    db = database.SessionLocal()
    user = db.query(models.User).filter(models.User.username == username).first()

    if not user or not pwd_context.verify(password, user.password):
        raise HTTPException(status_code=401, detail="Invalid username or password")
    token = create_jwt_token(user.id)
    response = RedirectResponse(url="/index", status_code=301)
    response.set_cookie(key="token", value=token)
    return response

Я пытаюсь хэшировать пароль, который вводит пользователь, чтобы его можно было сверить с хэшированным паролем в базе данных. Я также пробовал password = form.get("password"), но ошибка все равно выскакивает.

Вот эта ошибка:

File "C:\Users\user\Desktop\VSPRojects\LoginFastapi\db\views.py", line 53, in login
    if not user or not pwd_context.verify(password, user.password):
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\Desktop\VSPRojects\LoginFastapi\venv\Lib\site-packages\passlib\context.py", line 2343, in verify
    record = self._get_or_identify_record(hash, scheme, category)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\Desktop\VSPRojects\LoginFastapi\venv\Lib\site-packages\passlib\context.py", line 2031, in _get_or_identify_record
    return self._identify_record(hash, category)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\Desktop\VSPRojects\LoginFastapi\venv\Lib\site-packages\passlib\context.py", line 1132, in identify_record    raise exc.UnknownHashError("hash could not be identified")
passlib.exc.UnknownHashError: hash could not be identified

Вы можете использовать passlib.hash от django_pbkdf2_sha256, который является специальным обработчиком, который соответствует алгоритму Django для паролей, использующих pbkdf2_sha256, как и размер контрольной суммы.

НАПРИМЕР:

from passlib.hash import django_pbkdf2_sha256

security = HTTPBasic()


async def login(request: Request):
    form = await request.form()
    username = form.get("username")
    password = form.get("password")
    db = database.SessionLocal()
    user = db.query(models.User).filter(models.User.username == username).first()

    if not user or not django_pbkdf2_sha256.verify(password, user.password):
        raise HTTPException(status_code=401, detail="Invalid username or password")
    token = create_jwt_token(user.id)
    response = RedirectResponse(url="/index", status_code=301)
    response.set_cookie(key="token", value=token)
    return response
Вернуться на верх