GithubHelp home page GithubHelp logo

auth_sprint_1's Introduction

Устанока

https://github.com/mshinkareva/Auth_sprint_1

  1. Прописать переменные окружения в файлах /auth-service/env
  2. Сгеренировать пары ключей для /auth-service/nginx/ssl.key /auth-service/nginx/ssl.pem
  3. Перейти в директорию с docker-compose.yaml
  4. Запустить установку
docker-compose up -d --build --force-recreate
  1. Сервис доступен по адресу https://127.0.0.1:444/api/openapi#/

Для отладки

http://127.0.0.1:8002/api/openapi#/ - дев окружение

auth_sprint_1's People

Contributors

ceratuz avatar lapparrr avatar mshinkareva avatar

Watchers

 avatar

auth_sprint_1's Issues

11 авторизация свагер

В Swagger документацию можно и даже нужно добавить авторизацию, для полноценной работы с эндпоинтами.

5. вынести значение в переменные окружения

В auth-service/app/src/main.py в конструкции
postgres.engine = AsyncEngine(
create_engine(settings.pg_url(), echo=True, future=True)
)

Значение параметра echo лучше вынести в настройки и переменную окружение, нам не всегда нужны логи запросов в базу данных, а он именно за это отвечает

15 упаковать в payload токен

Рекомендую роль пользователя упаковывать в Рекомендую роль пользователя упаковывать в payload его access токена. Мы же как-то должны знать, что ему можно, а что нельзя. его access токена. Мы же как-то должны знать, что ему можно, а что нельзя.

Code rview

вот еще интересное заметил.

async def get_permissions(self) -> list[PermissionInDb]:
logger.info("Start get_permissions")
data = await self.pg.execute(select(Permission))
return [
PermissionInDb(name=it.name, description=it.description)
for it in data.scalars()
]

А потом уже в эндпоинте опять

@router.get(
'/list',
status_code=HTTPStatus.OK,
tags=['permissions'],
description='List Permissions',
summary="Список разрешений",
)
async def get_permission(
service: PermissionService = Depends(permission_services),
) -> list[PermissionInDb]:
result = await service.get_permissions()
if not result:
raise HTTPException(
status_code=HTTPStatus.BAD_REQUEST, detail='Permission not exist'
)
return [PermissionInDb(name=it.name, description=it.description) for it in result]

У вас тут два раза делается вот такая штука (и исключение там вообще лишнее Permission not exist, вернуть пустой список - не криминал, чего сразу ругаться то?):

[PermissionInDb(name=it.name, description=it.description) for it in result] 

А можно вообще упростить до:

@router.get(
    '/list',
    response_model=list[PermissionInDb],
    status_code=HTTPStatus.OK,
    tags=['permissions'],
    description='List Permissions',
    summary="Список разрешений",
)
async def get_permission(
    service: PermissionService = Depends(permission_services),
) -> list[PermissionInDb]:
    return await service.get_permissions()

А в auth-service/app/src/services/permission.py:

async def get_permissions(self) -> list[Permission]:
    logger.info("Start get_permissions")
    data = await self.pg.execute(select(Permission))
    return data.scalars()

А всеми преобразованиями list[Permission] => list[PermissionInDb] займется FastAPI, при этом будет ориентироваться на поле response_model в эндпоинте, а если его нет то на тип возвращаемого значения -> list[PermissionInDb] и все это благодаря orm_mode = True, который у вас установлен в модели PermissionInDb

4. авторизация

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

13 пагинация

При выдаче списков необходимо предусмотреть пагинацию.

7 фильтрация рейт лимита

Продолжая про RateLimiter, он же ограничивает ВСЕХ пользователей. Т.е. если я злоумышленник и заваливаю сервис запросами, то все пользователи ждут пока мне это надоест. Попробуйте https://github.com/long2ice/fastapi-limiter, там гибкие настройки, и даже по умолчанию, фильтрация по ip адресу.

12 декоратор для авторизации

Сначала написал п.11, а потом увидел, что у вас вообще ВСЕ доступно всем, даже без какой-либо авторизации. Например, управление пользователями и ролями должно быть только у админа. А у меня без авторизации получилось создать роль. Лучше проверку прав делать в виде декоратора для эндпоинта, так сразу видно кому что разрешено.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.