https://github.com/profcomff/auth-lib
Библиотека функций авторизации для микросервисов Твой ФФ!
https://github.com/profcomff/auth-lib
auth-service
Last synced: 7 months ago
JSON representation
Библиотека функций авторизации для микросервисов Твой ФФ!
- Host: GitHub
- URL: https://github.com/profcomff/auth-lib
- Owner: profcomff
- License: bsd-3-clause
- Created: 2022-09-17T20:05:52.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2024-08-03T22:08:02.000Z (over 1 year ago)
- Last Synced: 2025-03-28T18:55:14.390Z (7 months ago)
- Topics: auth-service
- Language: Python
- Homepage: https://pypi.org/project/auth-lib-profcomff/
- Size: 73.2 KB
- Stars: 12
- Watchers: 0
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# auth-lib
Библиотека функций авторизации для микросервисов Твой ФФ!
[
](https://easycode.profcomff.com/templates/docker-fastapi/workspace?mode=manual¶m.Repository+URL=https://github.com/profcomff/auth-lib.git¶m.Working+directory=auth-lib)
[](https://pypi.org/project/auth-lib-profcomff)
[](https://t.me/+eIMtCymYDepmN2Ey)
## Функционал
Хранение общих методов аутентификации и авторизации для бэкендов Твой ФФ
## Примеры использования
### FastAPI
```python
from auth_lib.fastapi import UnionAuth
from fastapi import APIRouter, Depends
router = APIRouter(prefix="/...")
## Чтобы дернуть ручку нужен один скоуп, авторизация обязательна
## Юзкейс https://github.com/profcomff/timetable-api/blob/a374c74cd960941100f6c923ff9c3ff706a1ed09/calendar_backend/routes/room/room.py#L45
@router.smth("/")
async def foo(_=Depends(UnionAuth(scopes=["service.resource.method"], allow_none=False, auto_error=True))):
pass
## Чтобы дернуть ручку нужно два скоупа, авторизация обязательна
## Юзкейс https://github.com/profcomff/print-api/blob/775f36fdd185eec8d9096d3472b7730cf5ac9798/print_service/routes/user.py#L78
@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="..."
#### Настройки
```python
auth_url="https://api.test.profcomff.com/auth/"
AUTH_AUTO_ERROR: bool = True
AUTH_ALLOW_NONE: bool = False
```
## Тестирование сервисов
Установите нужные завивсимости
```shell
pip install 'auth-lib-profcomff[testing]'
```
Используйте маркировку для тестирования
```python
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
- Основная [информация](https://github.com/profcomff/.github/wiki/%255Bdev%255D-Backend-%25D1%2580%25D0%25B0%25D0%25B7%25D1%2580%25D0%25B0%25D0%25B1%25D0%25BE%25D1%2582%25D0%25BA%25D0%25B0) по разработке наших приложений
- [Ссылка](https://github.com/profcomff/auth-lib/blob/main/CONTRIBUTING.md) на страницу с информацией по разработке auth-lib