package platform import ( "encoding/json" "errors" "fmt" "io" "net/url" "strings" "github.com/linweiyuan/go-chatgpt-api/api" http "github.com/bogdanfinn/fhttp" ) //goland:noinspection GoUnhandledErrorResult,GoErrorStringFormat,GoUnusedParameter func (userLogin *UserLogin) GetAuthorizedUrl(csrfToken string) (string, int, error) { urlParams := url.Values{ "client_id": {platformAuthClientID}, "audience": {platformAuthAudience}, "redirect_uri": {platformAuthRedirectURL}, "scope": {platformAuthScope}, "response_type": {platformAuthResponseType}, } req, _ := http.NewRequest(http.MethodGet, platformAuth0Url+urlParams.Encode(), nil) req.Header.Set("Content-Type", api.ContentType) req.Header.Set("User-Agent", api.UserAgent) resp, err := userLogin.client.Do(req) if err != nil { return "", http.StatusInternalServerError, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return "", resp.StatusCode, errors.New(api.GetAuthorizedUrlErrorMessage) } return resp.Request.URL.String(), http.StatusOK, nil } func (userLogin *UserLogin) GetState(authorizedUrl string) (string, int, error) { split := strings.Split(authorizedUrl, "=") return split[1], http.StatusOK, nil } //goland:noinspection GoUnhandledErrorResult,GoErrorStringFormat func (userLogin *UserLogin) CheckUsername(state string, username string) (int, error) { formParams := fmt.Sprintf( "state=%s&username=%s&js-available=true&webauthn-available=true&is-brave=false&webauthn-platform-available=false&action=default", state, username, ) req, err := http.NewRequest(http.MethodPost, api.LoginUsernameUrl+state, strings.NewReader(formParams)) req.Header.Set("Content-Type", api.ContentType) req.Header.Set("User-Agent", api.UserAgent) resp, err := userLogin.client.Do(req) if err != nil { return http.StatusInternalServerError, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return resp.StatusCode, errors.New(api.EmailInvalidErrorMessage) } return http.StatusOK, nil } //goland:noinspection GoUnhandledErrorResult,GoErrorStringFormat func (userLogin *UserLogin) CheckPassword(state string, username string, password string) (string, int, error) { formParams := fmt.Sprintf( "state=%s&username=%s&password=%s&action=default", state, username, password, ) req, err := http.NewRequest(http.MethodPost, api.LoginPasswordUrl+state, strings.NewReader(formParams)) req.Header.Set("Content-Type", api.ContentType) req.Header.Set("User-Agent", api.UserAgent) resp, err := userLogin.client.Do(req) if err != nil { return "", http.StatusInternalServerError, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return "", resp.StatusCode, errors.New(api.EmailOrPasswordInvalidErrorMessage) } return resp.Request.URL.Query().Get("code"), http.StatusOK, nil } //goland:noinspection GoUnhandledErrorResult,GoErrorStringFormat func (userLogin *UserLogin) GetAccessToken(code string) (string, int, error) { jsonBytes, _ := json.Marshal(GetAccessTokenRequest{ ClientID: platformAuthClientID, Code: code, GrantType: platformAuthGrantType, RedirectURI: platformAuthRedirectURL, }) req, err := http.NewRequest(http.MethodPost, getTokenUrl, strings.NewReader(string(jsonBytes))) req.Header.Set("Content-Type", "application/json") req.Header.Set("User-Agent", api.UserAgent) resp, err := userLogin.client.Do(req) if err != nil { return "", http.StatusInternalServerError, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return "", resp.StatusCode, errors.New(api.GetAccessTokenErrorMessage) } data, _ := io.ReadAll(resp.Body) return string(data), http.StatusOK, nil }