package util import ( "fmt" "github.com/davidebianchi/go-jsonclient" "net/http" "net/url" ) type oAuthAccessTokenReq struct { ClientID string `json:"client_id"` ClientSecret string `json:"client_secret"` Code string `json:"code"` GrantType string `json:"grant_type"` RedirectURI string `json:"redirect_uri"` } type oAuthAccessTokenResp struct { AccessToken string `json:"access_token"` TokenType string `json:"token_type"` ExpiresIn int `json:"expires_in"` RefreshToken string `json:"refresh_token"` } func GetOAuthToken(oAuthAccessTokenURL, clientID, clientSecret, code, redirectURI string) (string, error) { u, err := url.Parse(oAuthAccessTokenURL) if err != nil { logger.Errorf(`failed to parse oAuthAccessTokenURL. error: %s`, err.Error()) return ``, err } client, err := jsonclient.New(jsonclient.Options{ BaseURL: fmt.Sprintf(`%s://%s/`, u.Scheme, u.Host), }) if err != nil { logger.Errorf(`failed to create access_token client. error: %s`, err.Error()) return ``, err } req, err := client.NewRequest(http.MethodPost, u.Path, &oAuthAccessTokenReq{ ClientID: clientID, ClientSecret: clientSecret, Code: code, GrantType: `authorization_code`, RedirectURI: redirectURI, }) if err != nil { logger.Errorf(`failed to create access_token request. error: %s`, err.Error()) return ``, err } atResp := new(oAuthAccessTokenResp) resp, err := client.Do(req, atResp) if err != nil { logger.Errorf(`failed to request access_token. error: %s`, err.Error()) return ``, err } if resp.StatusCode >= 300 { logger.Errorf(`access_token request return wrong code. code: %d, err_msg: %s`, resp.StatusCode, resp.Status) return ``, err } return atResp.AccessToken, nil }