// routes/login/login.go package auth import ( "crypto/rand" "encoding/base64" "net/http" ) func NewLoginHandler(c Config) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // Generate random state b := make([]byte, 32) _, err := rand.Read(b) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } state := base64.StdEncoding.EncodeToString(b) session, err := Store.Get(r, SessionName) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } session.Values["state"] = state err = session.Save(r, w) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } authenticator, err := NewAuthenticator(c.Domain, c.ClientID, c.ClientSecret, c.CallbackURL) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } http.Redirect(w, r, authenticator.Config.AuthCodeURL(state), http.StatusTemporaryRedirect) } }