Skip to content

WATUNeed/FastAPI_authorisation

Repository files navigation

API авторизация пользователя

с использованием JWT токена


Стек

  • fastapi
  • sqlalchemy
  • pydantic
  • uvicorn
  • asyncpg
  • redis
  • alembic
  • jose

Устройство API

POST /register

Ожидает на вход UserCreate с полями: name, surname, email, password.

Создаёт и сохраняет пользователя: (user_id, name, surname, email, is_active, hashed_password).

Поля name и surname только буквенные символы и '-'. Поле email валидируется классом pydantic EmailStr. Поле password валидируется регуляркой по буквам двух регистров, длине и цифрам.

Пароль хэшируется библиотекой passli и заносится в Postgres.

user_id генерируется библиотекой uuid, классом UUID.

Возвращает ShowUser с полями: user_id, name, surname, email, is_active.

Поле email уникальное, если в бд уже есть введённая почта возвращается ошибка.

Поле is_active нужно для отметки активных пользователей (вместо удаления из базы может отметить "выключенного" пользователя).

POST /login

Ожидает на вход OAuth2PasswordRequestForm с полями: username(email), password.

Сверяет почту и пароль и возвращает JWT-токен.

Токен создаётся на 60 минут (expire).

Если пароль или почта неверные возвращает ошибку.

Если токена нет в Redis по ключу почты он генерируется и сохраняется в Redis. Если токен есть в noSQL базе после проверки пароля возвращается токен (не генерируется новый).

Возвращается Token с полем: access_token.

POST /logout

Доступно только авторизованным пользователям.

Удаляет токен из Redis.

Возвращает Token с полем: success.

POST /task

Доступно только авторизованным пользователям.

Ожидает на вход TaskCreate с полями: name, content.

Создаёт и записывает в базу задачу с полями: user_id, task_id, name, content.

task_id сохраняется с типом UUID.

Пользователь может создать запись только от своего имени.

Возвращает ShowTask с полями:user_id, task_id, name, content.

GET /tasks

Доступно только авторизованным пользователям.

Выводит список задач пользователя.

Отображаются только задачи текущего пользователя.

Возвращает ShowTasks с полями: [[user_id, task_id, name, content], ...].

GET /task/{task_id}

Доступно только авторизованным пользователям.

Ожидает на вход task_id.

Выводит задачу пользователя.

Пользователь может видеть только свои записи.

Если записи нет в базе или она не создана этим пользователем возвращается ошибка.

Возвращает ShowTask c полями:user_id, task_id, name, content.

PUT /task/{task_id}

Доступно только авторизованным пользователям.

Ожидает на вход TaskEdit с полями: task_id, name, content.

Изменяет содержимое задачи пользователя.

Пользователь может менять только свои записи.

Если записи нет в базе или она не создана этим пользователем возвращается ошибка.

Возвращает ShowTask c полями:user_id, task_id, name, content.

DELETE /task/{task_id}

Доступно только авторизованным пользователям.

Ожидает на вход task_id.

Удаляет задачу пользователя.

Пользователь может удалять только свои записи.

Если записи нет в базе или она не создана этим пользователем возвращается ошибка.

Возвращает Success с полем: success.

Все запросы

Стоит общее ограничение на количество запросов (сейчас 100 в минуту). Изменяется значение в модуле config.py.


Схема сущности users:

user_id name surname is_active hashed_password
uuid.UUID str str bool str
... ... ... ... ...

Сущности users и tasks связаны по атрибуту user_id (один ко многим).

Схема сущности tasks:

user_id task_id name content
uuid.UUID uuid.UUID str str
... ... ... ...

Как выполнять запросы

  1. Запустить API через docker.
  2. Перейти по ссылке http://host:port/docs/.
  3. Выполнить нужные запросы.

или через CURL запросы в консоли.


Особенности

Подлючен и настроен Docker. Используется docker-compose.yaml файл, и docker_entrypoint.sh для автоматической миграции моделей через Alembic.

Все сессии подключения к бд происходят через декоратор utils.decorators.request() -> автоматический откат при ошибке, сокращенье повторения кода.

Бизнес-логика содержится в модуле dals.py и не зависит от FastAPI.

Асинхронный ход в Postgres.


Инструкции

Запуск через Docker
  1. Выполнить команду:
    docker-compose up --build
    
Настройка Alembic:
  1. Создать файлы Alembic:
    alembic init -t async alembic
    
  2. Внести в alembic.ini:
    # alembic.ini
    sqlalchemy.url = postgresql+asyncpg://user:pass@port:host/db_name
    
  3. Внести в alembic.env.py:
    # alembic.env.py
    from db.models import Base
    target_metadata = Base.metadata
    
  4. Создание миграции:
    alembic revision --autogenerate -m 'migration_name'
    
Настройка переменных окружения
  1. Создать файл .env:
    # .env
    POSTGRES_USER=...
    POSTGRES_PASSWORD=...
    POSTGRES_DB=...
    DATABASE_URL=postgresql+asyncpg://user:pass@port:host/db_name
    REDIS_HOST=...
    REDIS_PORT=...
    SECRET=...
    ALGORITHM=...
    

TODO

  • Логирование в файл.
  • Тесты.
  • Добавление кеширования часто запрашиваемых данных в Redis.

About

Asynchronous API on the FastAPI framework for user registration, authentication and authorisation.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages