5.10 Реализация аутентификации используя HTTP Basic Auth
7 из 7 шагов пройдено
2 из 2 баллов  получено

Первым делом установим необходимые зависимости:

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


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Нет обсуждений. Начните первое.