wide/util/oauth_token.go

66 lines
1.7 KiB
Go

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
}