feat(auth): force re-login after logout via prompt=login

This commit is contained in:
Claus Lohmar 2026-06-15 08:12:32 +00:00
parent 49c4254594
commit 6bec565b7a
2 changed files with 44 additions and 1 deletions

View file

@ -228,9 +228,34 @@ func (h *OIDCHandler) AuthGateMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, ok := GetUserID(r)
if !ok {
// Check if force-login is requested (after logout)
if _, ferr := r.Cookie("force_login"); ferr == nil {
http.SetCookie(w, &http.Cookie{Name: "force_login", Value: "", Path: "/", Domain: h.config.Domain, MaxAge: -1, HttpOnly: true})
h.LoginRedirectWithPrompt(w, r, "login")
return
}
h.LoginRedirect(w, r)
return
}
next.ServeHTTP(w, r)
})
}
// LoginRedirectWithPrompt redirects with a specific prompt value.
func (h *OIDCHandler) LoginRedirectWithPrompt(w http.ResponseWriter, r *http.Request, prompt string) {
state := generateToken(16)
nonce := generateToken(16)
verifier := generateToken(32)
challenge := pkceChallenge(verifier)
http.SetCookie(w, &http.Cookie{Name: "oidc_state", Value: state, Path: "/", Domain: h.config.Domain, MaxAge: 300, HttpOnly: true, SameSite: http.SameSiteLaxMode})
http.SetCookie(w, &http.Cookie{Name: "oidc_verifier", Value: verifier, Path: "/", Domain: h.config.Domain, MaxAge: 300, HttpOnly: true, SameSite: http.SameSiteLaxMode})
authURL := fmt.Sprintf(
"%s/api/oidc/authorize?prompt=%s&response_type=code&client_id=%s&redirect_uri=%s&scope=openid+profile+email&state=%s&nonce=%s&code_challenge=%s&code_challenge_method=S256",
h.config.IssuerURL, prompt,
url.QueryEscape(h.config.ClientID), url.QueryEscape(h.config.RedirectURL),
state, nonce, challenge,
)
http.Redirect(w, r, authURL, http.StatusFound)
}

View file

@ -132,7 +132,25 @@ func main() {
HttpOnly: true,
SameSite: http.SameSiteLaxMode,
})
// Clear NextWks session, redirect to workspace (no session → Authelia login)
// Clear NextWks session and set force-login flag
http.SetCookie(w, &http.Cookie{
Name: "nextwks_session",
Value: "",
Path: "/",
Domain: cfg.OIDC.Domain,
MaxAge: -1,
HttpOnly: true,
SameSite: http.SameSiteLaxMode,
})
http.SetCookie(w, &http.Cookie{
Name: "force_login",
Value: "1",
Path: "/",
Domain: cfg.OIDC.Domain,
MaxAge: 300,
HttpOnly: true,
SameSite: http.SameSiteLaxMode,
})
http.Redirect(w, r, "/", http.StatusFound)
})