From 617c665a2eacc37a13c8c5362cfbe23aae8cf397 Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 24 Aug 2026 13:01:21 +0200 Subject: [PATCH] fix(oidc): klare Meldung bei einem OIDC_ISSUER ohne Schema MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OIDC_ISSUER=PocketID (der Name statt der Adresse) endete in unsupported protocol scheme "" – tief aus der Bibliothek, ohne Hinweis auf die Ursache. Und weil ein Fehlschlag hier den Start abbricht, stand die ganze Cloud wegen einer Zeile in der .env. Jetzt wird vorher geprueft und die Zeile beim Namen genannt. Co-Authored-By: Claude Opus 5 --- .env.example | 5 +++-- backend/internal/oidc/handler.go | 14 +++++++++++++- deploy/.env.example | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/.env.example b/.env.example index 1fdf050..f203d13 100644 --- a/.env.example +++ b/.env.example @@ -44,8 +44,9 @@ ADMIN_USERNAME=admin ADMIN_PASSWORD= # ── Anmeldung über einen Identitätsanbieter (optional) ─────────────────────── -# Leerer OIDC_ISSUER = aus. -OIDC_ISSUER= +# Leerer OIDC_ISSUER = aus. Sonst die vollständige Adresse des Anbieters – +# nicht seinen Namen. Falsch gesetzt bricht der Start ab. +OIDC_ISSUER= # z. B. https://id.example.com OIDC_CLIENT_ID=aether OIDC_CLIENT_SECRET= # Muss exakt /api/v1/auth/oidc/callback sein. diff --git a/backend/internal/oidc/handler.go b/backend/internal/oidc/handler.go index 429bff3..72c826b 100644 --- a/backend/internal/oidc/handler.go +++ b/backend/internal/oidc/handler.go @@ -7,6 +7,7 @@ import ( "encoding/json" "fmt" "net/http" + "net/url" "strings" gooidc "github.com/coreos/go-oidc/v3/oidc" @@ -46,9 +47,20 @@ func New(ctx context.Context, cfg Config, authStore *auth.Store, sessions *auth. if cfg.Issuer == "" { return nil, nil } + // Erst prüfen, ob überhaupt eine Adresse dasteht. Sonst hängt der Fehler + // tief in der Bibliothek: `unsupported protocol scheme ""` sagt nicht, + // dass jemand den *Namen* des Anbieters eingetragen hat statt seiner URL. + // Und weil ein Fehlschlag hier den Start abbricht, steht die ganze Cloud + // wegen einer Zeile in der .env – dann soll die Zeile wenigstens genannt + // werden. (Gemessen mit OIDC_ISSUER=PocketID.) + if u, uerr := url.Parse(cfg.Issuer); uerr != nil || u.Scheme == "" || u.Host == "" { + return nil, fmt.Errorf( + "OIDC_ISSUER muss die vollstaendige Adresse des Anbieters sein, "+ + "z. B. https://id.example.com – gefunden: %q", cfg.Issuer) + } provider, err := gooidc.NewProvider(ctx, cfg.Issuer) if err != nil { - return nil, fmt.Errorf("oidc provider: %w", err) + return nil, fmt.Errorf("oidc provider %q nicht erreichbar: %w", cfg.Issuer, err) } oauthCfg := &oauth2.Config{ ClientID: cfg.ClientID, diff --git a/deploy/.env.example b/deploy/.env.example index c29d219..1c81c32 100644 --- a/deploy/.env.example +++ b/deploy/.env.example @@ -50,7 +50,7 @@ ADMIN_PASSWORD=changeme_strong_admin_password # ── OIDC (optional) ─────────────────────────────────────────────────────────── # Leerer OIDC_ISSUER = aus. OIDC_REDIRECT_URL muss exakt # /api/v1/auth/oidc/callback sein und beim Anbieter eingetragen. -# OIDC_ISSUER=https://your-idp.example.com +# OIDC_ISSUER=https://your-idp.example.com # Adresse, nicht der Name # OIDC_CLIENT_ID=aether # OIDC_CLIENT_SECRET= # OIDC_REDIRECT_URL=https://cloud.example.com/api/v1/auth/oidc/callback