Upravil jsem Google OAuth tak, že Google uživatel se hledá/vytváří přes email, ukládá auth_provider='google', provider_subject, display_name, avatar_url a po úspěšném loginu last_login_at. První Google uživatel v prázdné users tabulce dostane admin, další noví Google uživatelé viewer.

Přidal jsem AUTH_MODE=google|mixed|local:

google: jen Google login, lokální/Gitea nejdou ani přes přímý endpoint
mixed: Google + lokální/Gitea fallback
local: jen lokální login
Správa uživatelů zůstává admin-only, guard posledního admina platí pro odebrání role i deaktivaci. Přidal jsem do ní i přehled oprávnění rolí a zobrazení provider/avatar metadat.

DB migrace teď přes PRAGMA table_info(users) doplňuje chybějící sloupce bez mazání/recreate existující tabulky; pokud users vůbec neexistuje, bezpečně ji vytvoří. Podporované sloupce zahrnují email, display_name, role, is_enabled, created_at, updated_at, last_login_at, auth_provider, provider_subject, plus kompatibilní sloupce pro lokální login.
This commit is contained in:
JiriUhlir
2026-06-10 08:37:42 +02:00
parent 9cec3d001f
commit 272b1eb883
7 changed files with 295 additions and 16 deletions
+12
View File
@@ -11,6 +11,7 @@ DEFAULT_GITEA_ORG = "appfactory"
INTERNAL_GITEA_URL = "http://appfactory-gitea:3000"
PORTAL_PREFIX = "/portal"
AUTH_MODES = {"google", "mixed", "local"}
def read_env_value(key: str, default: str = "") -> str:
@@ -107,6 +108,9 @@ def get_auth_domain_readiness() -> dict[str, bool]:
return {
"portal_public_url_configured": bool(get_portal_public_url()),
"auth_mode_google": get_auth_mode() == "google",
"auth_mode_mixed": get_auth_mode() == "mixed",
"auth_mode_local": get_auth_mode() == "local",
"google_oauth_enabled": google_enabled,
"google_oauth_configured": bool(google_client_id and google_client_secret and google_redirect_uri),
"google_redirect_uri_configured": bool(google_redirect_uri),
@@ -114,9 +118,17 @@ def get_auth_domain_readiness() -> dict[str, bool]:
}
def get_auth_mode() -> str:
mode = read_env_value("AUTH_MODE", "mixed").strip().lower()
if mode in AUTH_MODES:
return mode
return "mixed"
def is_google_oauth_button_enabled() -> bool:
return bool(
read_env_bool("GOOGLE_OAUTH_ENABLED")
and read_env_value("GOOGLE_CLIENT_ID", "")
and read_env_value("GOOGLE_CLIENT_SECRET", "")
and get_google_redirect_uri()
)