Комментарии про методы входа приведены к факту (логин/пароль и Telegram везде, stub только в development): config.py, .env.example, telegram.py, dev_stub.py, dev_auth.py, login.py. admin_login.py больше не обещает «строже игроцкого» — описаны реальные лимиты; client_ip — адрес за прокси уже даёт uvicorn. Подсказки деплоя: run.ps1/run.sh (build-push на ПК, `up -d` на Pi), compose, .env.example (build-push.ps1), Caddyfile (туннель-контейнер вместо autossh); ratelimit.py ссылается на core/events.py вместо CLAUDE.md. Удалены неиспользуемые scripts/export-prod.sh (с блоком export-ignore в .gitattributes и упоминаниями в README), db/init_db.py и случайно закоммиченный файл «h -u origin dev…». #70 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
24 lines
874 B
Python
24 lines
874 B
Python
"""Dev-провайдер: вход без секрета по нику/идентификатору (только development)."""
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from app.auth.provider import AuthProvider, ExternalIdentity
|
|
from app.core.errors import ValidationError
|
|
|
|
|
|
class DevStubProvider(AuthProvider):
|
|
name = "stub"
|
|
|
|
def authenticate(self, payload: dict[str, Any]) -> ExternalIdentity:
|
|
nickname = (payload.get("nickname") or "").strip()
|
|
external_id = str(payload.get("external_id") or nickname).strip()
|
|
if not external_id:
|
|
raise ValidationError("Укажите никнейм для входа.")
|
|
return ExternalIdentity(
|
|
provider=self.name,
|
|
external_id=external_id,
|
|
suggested_nickname=nickname or external_id,
|
|
raw=dict(payload),
|
|
)
|