package auth import ( "fmt" "log/slog" "net/http" "forge.cadoles.com/wpetit/clearcase/internal/core/model" "forge.cadoles.com/wpetit/clearcase/internal/http/handler/webui/common" "github.com/markbates/goth/gothic" "github.com/pkg/errors" ) func (h *Handler) handleProvider(w http.ResponseWriter, r *http.Request) { if _, err := gothic.CompleteUserAuth(w, r); err == nil { http.Redirect(w, r, "/auth/logout", http.StatusTemporaryRedirect) } else { gothic.BeginAuthHandler(w, r) } } func (h *Handler) handleProviderCallback(w http.ResponseWriter, r *http.Request) { gothUser, err := gothic.CompleteUserAuth(w, r) if err != nil { slog.ErrorContext(r.Context(), "could not complete user auth", slog.Any("error", errors.WithStack(err))) http.Redirect(w, r, "/auth/logout", http.StatusTemporaryRedirect) return } ctx := r.Context() slog.DebugContext(ctx, "authenticated user", slog.Any("user", gothUser)) user := &model.User{ ID: gothUser.UserID, Provider: gothUser.Provider, AccessToken: gothUser.AccessToken, IDToken: gothUser.IDToken, } if err := h.storeSessionUser(w, r, user); err != nil { slog.ErrorContext(r.Context(), "could not store session user", slog.Any("error", errors.WithStack(err))) http.Redirect(w, r, "/auth/logout", http.StatusTemporaryRedirect) return } http.Redirect(w, r, "/", http.StatusSeeOther) } func (h *Handler) handleLogout(w http.ResponseWriter, r *http.Request) { user, err := h.retrieveSessionUser(r) if err != nil && !errors.Is(err, errSessionNotFound) { common.HandleError(w, r, errors.WithStack(err)) return } if err := h.clearSession(w, r); err != nil && !errors.Is(err, errSessionNotFound) { common.HandleError(w, r, errors.WithStack(err)) return } if user == nil { http.Redirect(w, r, "/", http.StatusTemporaryRedirect) return } redirectURL := fmt.Sprintf("/auth/providers/%s/logout", user.Provider) http.Redirect(w, r, redirectURL, http.StatusTemporaryRedirect) } func (h *Handler) handleProviderLogout(w http.ResponseWriter, r *http.Request) { if err := gothic.Logout(w, r); err != nil { common.HandleError(w, r, errors.WithStack(err)) return } http.Redirect(w, r, "/", http.StatusTemporaryRedirect) }