go-chatgpt-api / api /platform /access_token.go
dvc890's picture
Upload 25 files
36a4021
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
}