Skip to main content

Reusable JWT auth for FastAPI (password flow)

Project description

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

auth_rsha-0.1.2.tar.gz (8.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

auth_rsha-0.1.2-py3-none-any.whl (8.4 kB view details)

Uploaded Python 3

File details

Details for the file auth_rsha-0.1.2.tar.gz.

File metadata

  • Download URL: auth_rsha-0.1.2.tar.gz
  • Upload date:
  • Size: 8.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for auth_rsha-0.1.2.tar.gz
Algorithm Hash digest
SHA256 d737823dac001509e7390cfec9a97d95df478b545226325be78a6dece4734246
MD5 766de3c8a0ad274129f87f6ec67f2b6c
BLAKE2b-256 e0c545cb674f24243a6c20fe6761a4274a886b9b0693525476f4450d473e0105

See more details on using hashes here.

File details

Details for the file auth_rsha-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: auth_rsha-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 8.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for auth_rsha-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e0f60bd7471ad64260c79a1c381440d310f9830b127f2f5b3fca0e44d7dbe057
MD5 5527fa188de95a10e7dc966f10ea7456
BLAKE2b-256 504b3e392830b502f612ab8a082772e6bf1eafb4328da11f48282858e5aeff88

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page