func loginHandler(providerName string) http.HandlerFunc { provider, err := gomniauth.Provider(providerName) if err != nil { panic(err) } return func(w http.ResponseWriter, r *http.Request) { state := gomniauth.NewState("after", "success") // This code borrowed from goweb example and not fixed. // if you want to request additional scopes from the provider, // pass them as login?scope=scope1,scope2 //options := objx.MSI("scope", ctx.QueryValue("scope")) authUrl, err := provider.GetBeginAuthURL(state, nil) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // redirect http.Redirect(w, r, authUrl, http.StatusFound) } }
func callbackHandler(providerName string) http.HandlerFunc { provider, err := gomniauth.Provider(providerName) if err != nil { panic(err) } return func(w http.ResponseWriter, r *http.Request) { omap, err := objx.FromURLQuery(r.URL.RawQuery) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } creds, err := provider.CompleteAuth(omap) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } /* // This code borrowed from goweb example and not fixed. // get the state state, err := gomniauth.StateFromParam(ctx.QueryValue("state")) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // redirect to the 'after' URL afterUrl := state.GetStringOrDefault("after", "error?e=No after parameter was set in the state") */ // load the user user, userErr := provider.GetUser(creds) if userErr != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } data := fmt.Sprintf("%#v", user) io.WriteString(w, data) // redirect //return goweb.Respond.WithRedirect(ctx, afterUrl) } }