40 lines
1.4 KiB
Python
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."""
|