Первым делом установим необходимые зависимости:
pip install passlib
pip install bcrypt==4.0.1
И приступим к реализации конечной точки, для этого создадим файл auth.py в папке routers следующего содержания:
from fastapi import APIRouter, Depends, status, HTTPException
from sqlalchemy import select, insert
from app.models.user import User
from app.schemas import CreateUser
from app.backend.db_depends import get_db
from typing import Annotated
from sqlalchemy.ext.asyncio import AsyncSession
from passlib.context import CryptContext
router = APIRouter(prefix='/auth', tags=['auth'])
bcrypt_context = CryptContext(schemes=['bcrypt'], deprecated='auto')
@router.post('/')
async def create_user(db: Annotated[AsyncSession, Depends(get_db)], create_user: CreateUser):
await db.execute(insert(User).values(first_name=create_user.first_name,
last_name=create_user.last_name,
username=create_user.username,
email=create_user.email,
hashed_password=bcrypt_context.hash(create_user.password),
))
await db.commit()
return {
'status_code': status.HTTP_201_CREATED,
'transaction': 'Successful'
}
Разберем данный код подробнее. Первым делом, мы создаем экземпляр класса APIRouter, в котором указываем путь для группировки наших конечных точек и тег.
Далее мы создаем экземпляр класса CryptContext, из библиотеки passlib. Этот класс предназначен для обработки многих более частых шаблонов кодирования, которые встречаются в приложениях, которым необходимо обрабатывать хэши паролей. В своей основе класс CryptContext - это просто набор объектов PasswordHash, импортированных по имени из модуля passlib.hash. Следующий фрагмент кода создает новый контекстный объект, который поддерживает алгоритм хеширования bcrypt:
bcrypt_context = CryptContext(schemes=['bcrypt'], deprecated='auto')
bcrypt - это метод хэширования паролей, используемая для их защиты в базах данных чтобы их не смог использовать тот, кто получит доступ к исходному хэшу.
В настоящее время bcrypt является алгоритмом шифрования по умолчанию в некоторых языках программирование, и на данный момент является наиболее безопасным вариантом хэширования паролей.
Хэширование паролей используется для их защиты при сохранении на сервере или в базе данных. При вводе только что созданного пароля он передаётся в функцию хэширования сохраняя результат. Поскольку хэш является односторонней операцией, извлечь хэшированный пароль невозможно.
Когда пользователь пытается войти в систему или требуется проверить его пароль, исходное значение поля, полученное при его вводе, хэшируется, и два хэша сравниваются. Если хэши одинаковы, то значит и пароль должен быть одинаковым.
Далее мы создаем конечную точку для создания пользователей, в которой записываем в базу данных поля из Pydantic схемы CreateUser, но получая пароль мы сохраняем его хэшированное значение bcrypt_context.hash(create_user.password)
В случае успешной работы возвращаем код ответа 201, сообщающим об успешном создании пользователя. В следующем шаге создадим пользователя и проверим работу.