72 lines
2.0 KiB
Go

package auth
import (
"fmt"
"log/slog"
"net/http"
"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) {
user, 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", user))
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)
}