Liga-System/auth/providers/base.py
2026-07-22 13:12:05 +00:00

40 lines
1.4 KiB
Python

from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class UserInfo:
"""Genormte Nutzerdaten — egal ob von Discord, Google oder sonstwem.
Jeder Provider liefert dieses Format, damit der Rest der App
nicht wissen muss, woher die Daten kommen."""
provider: str # 'discord', 'google', ...
provider_user_id: str # eindeutige ID beim Provider
username: str # z. B. Discord-Username
display_name: str # Anzeigename in deiner App
avatar_url: Optional[str] = None
email: Optional[str] = None
raw: dict = field(default_factory=dict) # Original-Payload des Providers
class AuthProvider(ABC):
"""Abstrakte Basisklasse für einen OAuth-Provider (Strategy Pattern).
Das ist der 'Steckplatz'. Jeder konkrete Provider muss diese
drei Dinge liefern. Wie er das intern macht, ist ihm überlassen.
"""
@property
@abstractmethod
def name(self) -> str:
"""Kurzname des Providers, z. B. 'discord'."""
@abstractmethod
def get_auth_url(self) -> str:
"""Baut die URL, zu der der User weitergeleitet wird, um zu autorisieren."""
@abstractmethod
def process_callback(self, code: str) -> UserInfo:
"""Tauscht den Auth-Code gegen Tokens und holt die Nutzerdaten.
Gibt ein genormtes UserInfo zurück oder wirft einen Fehler."""