Skip to main content

auth-rsha

Переиспользуемая JWT-аутентификация для FastAPI (password flow). Делает две вещи без лишней магии:

выдает access-токен по username/password на эндпоинте /auth/token;

даёт зависимость current_user, которая проверяет Bearer-токен в запросах.

Пакет не навязывает хранилище пользователей: ты сам даёшь репозиторий со своим способом поиска юзера.

Установка pip install auth-rsha

Быстрый старт

main.py

import os, secrets from fastapi import FastAPI, Depends from auth_rsha import AuthSettings, make_auth_router, make_current_user from auth_rsha.schemas import UserInDB, TokenPayload from auth_rsha.hashing import hash_password

1) Настройки: секрет либо из ENV, либо сгенерим для локалки

SECRET = os.getenv("AUTH_RSHA_SECRET") or secrets.token_urlsafe(64) settings = AuthSettings(jwt_secret=SECRET, access_ttl=3600)

2) Твой репозиторий: как угодно, лишь бы был метод get_by_username()

class InMemoryRepo: def init(self): self.users = { "david": UserInDB( id="1", username="david", password_hash=hash_password("pass123"), role="admin", is_active=True ) } async def get_by_username(self, username: str): return self.users.get(username)

repo = InMemoryRepo()

3) Приложение и маршруты

app = FastAPI(title="demo with auth-rsha") app.include_router(make_auth_router(settings, repo)) # POST /auth/token

4) Защита эндпоинтов

current_user = make_current_user(settings)

@app.get("/me") async def me(payload: TokenPayload = Depends(current_user)): return {"sub": payload.sub, "role": payload.role}

Проверка (curl)

Получить токен:

curl -X POST http://127.0.0.1:8000/auth/token
-H "Content-Type: application/x-www-form-urlencoded"
-d "username=david&password=pass123"

Ответ:

{ "access_token": "", "token_type": "bearer", "expires_in": 3600 }

Позвать защищённый эндпоинт:

curl http://127.0.0.1:8000/me -H "Authorization: Bearer "

Конфигурация (ENV) Переменная Значение по умолчанию Описание AUTH_RSHA_SECRET — (обязательно) Секрет для подписи JWT, >= 32 символов AUTH_RSHA_ACCESS_TTL 3600 Время жизни access-токена (сек) AUTH_RSHA_ALG HS256 Алгоритм подписи

Замечание: секрет должен быть стабильным между перезапусками сервиса. В проде клади его в secret-manager, а не генерируй на лету.

Публичное API

Импортируй из корня пакета:

from auth_rsha import AuthSettings, make_auth_router, make_current_user from auth_rsha.hashing import hash_password, verify_password

AuthSettings AuthSettings( jwt_secret: str, # min_length=32 jwt_alg: str = "HS256", access_ttl: int = 3600, token_url_path: str = "/auth/token", )

make_auth_router(settings, repo, *, prefix="", tags=("auth",)) -> APIRouter

Создает роутер с эндпоинтом POST {prefix}{token_url_path} (по умолчанию /auth/token). repo — любой объект с методом:

class UserRepository(Protocol): async def get_by_username(self, username: str) -> Optional[UserInDB]: ...

где UserInDB:

class UserInDB(BaseModel): id: str username: str password_hash: str role: Optional[str] = None is_active: bool = True

make_current_user(settings) -> Depends

Зависимость FastAPI, которая:

достаёт Bearer-токен из заголовка;

валидирует JWT;

возвращает TokenPayload(sub: str, role: Optional[str]).

Хеширование паролей from auth_rsha.hashing import hash_password, verify_password hash = hash_password("plain") verify_password("plain", hash) # True/False

Что библиотека сознательно не делает

Refresh-токены, logout/ревокация — это политика твоего сервиса. Этот пакет занимается только access-токеном.

Хранилище пользователей — полностью на твоей стороне: БД, внешняя система и т.п.

Rate limiting — ставь на /auth/token на уровне API-шлюза/прокси.

Рекомендации по безопасности

Короткий TTL (например, 900 секунд) и пере-выдача по мере надобности.

Секрет держать в secret-manager, а не в .env в репозитории.

Для блокировки скомпрометированных токенов — версионируй “token_version” у пользователя и проверяй её при каждом запросе (это уже логика твоего сервиса).

Лицензия

MIT

Metadata

Release files for auth-rsha 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for auth-rsha 0.1.2
File Size Uploaded
auth_rsha-0.1.2.tar.gz 8.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for auth-rsha 0.1.2
File Interpreter ABI Platform
auth_rsha-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 17.3 kB

Release files / auth_rsha-0.1.2.tar.gz

Download URL auth_rsha-0.1.2.tar.gz
Size 8.9 kB
Tags Source
SHA-256 checksum
How to use checksums
d737823dac001509e7390cfec9a97d95df478b545226325be78a6dece4734246
BLAKE2b-256 checksum
How to use checksums
e0c545cb674f24243a6c20fe6761a4274a886b9b0693525476f4450d473e0105
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.0

Release files / auth_rsha-0.1.2-py3-none-any.whl

Download URL auth_rsha-0.1.2-py3-none-any.whl
Size 8.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e0f60bd7471ad64260c79a1c381440d310f9830b127f2f5b3fca0e44d7dbe057
BLAKE2b-256 checksum
How to use checksums
504b3e392830b502f612ab8a082772e6bf1eafb4328da11f48282858e5aeff88
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.0

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page