func webAuthUser() (string, string, error) { resp, err := helpers.NewReq().Get("list/oauth2").Do() if err != nil { return "", "", errors.New("error occurred while getting OAuth2 URL: " + err.Error()) } var oauth2Data types.OauthMeta err = resp.Json(&oauth2Data) if err != nil { fmt.Print(helpers.RedText("Error parsing OAuth2 URL: " + err.Error())) return "", "", err } // Open a http server on port 3000 srv := &http.Server{Addr: ":3000"} go func() { err := srv.ListenAndServe() if err != http.ErrServerClosed { log.Fatal(err) } }() state := crypto.RandString(32) fmt.Println("") fmt.Println("") fmt.Print(helpers.BlueText("Please open the following URL in your browser and follow the instructions:")) fmt.Println("") fmt.Println(strings.ReplaceAll(oauth2Data.URL, "%REDIRECT_URL%", "http://localhost:3000") + "&state=" + state) // Wait for login login := <-loginCh fmt.Println("Got login code", login.code, "with state", login.state) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) srv.Shutdown(ctx) cancel() if login.state != state { time.Sleep(5 * time.Second) return "", "", errors.New("invalid state, please try again") } // Exchange code for token resp, err = helpers.NewReq().Put("users").Json(types.AuthorizeRequest{ ClientID: oauth2Data.ClientID, Code: login.code, Scope: "external_auth", Nonce: "@external", RedirectURI: "http://localhost:3000/auth/sauron", }).Do() if err != nil { time.Sleep(5 * time.Second) return "", "", errors.New("error occurred while exchanging code for token: " + err.Error()) } if resp.Response.StatusCode != 200 { fmt.Println("Login failed, got response code", resp.Response.StatusCode) body, err := resp.Body() if err != nil { return "", "", errors.New("error occurred while parsing error when exchanging code for token: " + err.Error()) } fmt.Println("Error body:", string(body)) return "", "", errors.New("login failed, got response code " + fmt.Sprint(resp.Response.StatusCode)) } var loginData types.UserLogin err = resp.Json(&loginData) if err != nil { return "", "", errors.New("error occurred while parsing login data: " + err.Error()) } return loginData.UserID, loginData.Token, nil }