auth-lib
Библиотека функций авторизации для микросервисов Твой ФФ!
Функционал
Хранение общих методов аутентификации и авторизации для бэкендов Твой ФФ
Примеры использования
FastAPI
from auth_lib.fastapi import UnionAuth
from fastapi import APIRouter, Depends
router = APIRouter(prefix="/...")
@router.smth("/")
async def foo(_=Depends(UnionAuth(scopes=["service.resource.method"], allow_none=False, auto_error=True))):
pass
@router.smth("/")
async def bar(_=Depends(UnionAuth(scopes=["scope1", "scope2"], allow_none=False, auto_error=True))):
pass
@router.smth("/")
async def baz(_=Depends(UnionAuth(scopes=[], allow_none=True, auto_error=True))):
pass
@router.smth("/")
async def foo(_=Depends(UnionAuth(scopes=[], allow_none=False, auto_error=True))):
pass
Depends вызывает инстанс класса с нужными параметрами и возвращает словарь со всеми полями отсюда https://api.test.profcomff.com/#/Logout/me_me_get
Параметры конструктора UnionAuth
scopes: list[str]
- список имен скоупов, которые нужны в данной ручке. Например ["printer.user.create", "printer.user.delete"]
allow_none: bool
- Если true, то при отсутствии нужного заголовка в запросе ручка будет доступна юзеру, если заголовк передан, то обработка идет в зависимости от следующего параметраauto_error: bool
- если True
, то при несовпадении скоупов/завершенной сессии и т.д. (на запрос GET /me
не 200) - кинет 401, если False
, то не будет кидать ошибки, но будет возвращать None
Чтобы задать хост авторизации надо в переменные окружения или в .env файл прописать AUTH_URL="..."
Настройки
auth_url="https://api.test.profcomff.com/auth/"
AUTH_AUTO_ERROR: bool = True
AUTH_ALLOW_NONE: bool = False
Тестирование сервисов
Установите нужные завивсимости
pip install 'auth-lib-profcomff[testing]'
Используйте маркировку для тестирования
import pytest
from fastapi.testclient import TestClient
from fastapi import FastAPI
@pytest.fixture
def client(auth_mock):
yield TestClient(FastAPI())
@pytest.mark.authenticated("scope1", "scope2", ..., user_id=5)
def test1(client):
"""
В этом тесте будут выданы скоупы scope1, scope2, user_id в ответе будет равен 5
библиотека не будет проверять токен через АПИ, будет просто возвращать
нужный словарь, как будто пользователь авторизован с нужными скоупами
"""
assert 2*2 == 4
@pytest.mark.authenticated()
def test2(client):
"""
В этом тесте скоупов выдано не будет, user_id будет равен 0
но библиотека не будет проверять токен через АПИ, будет просто возвращать
нужный словарь, как будто пользователь авторизован с нужными скоупами
"""
assert 2*2 == 4
def test3(client):
"""
В этом тесте скоупов выдано не будет, библиотека будет проверять
токен через АПИ
"""
assert 2*2 == 4
Contributing