Compare commits

..

2 Commits

Author SHA1 Message Date
4708c89c25
Add many error checks around authorization
All checks were successful
the build was successful
2018-12-27 19:28:51 +01:00
dd14b103e3
Add better error messages for parsing response body 2018-12-27 18:59:46 +01:00

View File

@ -9,6 +9,7 @@ import (
"net"
"net/http"
"net/url"
"strings"
"linkheader"
@ -24,10 +25,12 @@ type Endpoints struct {
}
type TokenResponse struct {
Me string `json:"me"`
AccessToken string `json:"access_token"`
TokenType string `json:"token_type"`
Scope string `json:"scope"`
Me string `json:"me"`
AccessToken string `json:"access_token"`
TokenType string `json:"token_type"`
Scope string `json:"scope"`
Error string `json:"error"`
ErrorDescription string `json:"error_description"`
}
func GetEndpoints(me *url.URL) (Endpoints, error) {
@ -151,18 +154,53 @@ func Authorize(me *url.URL, endpoints Endpoints, clientID, scope string) (TokenR
reqValues.Add("client_id", clientID)
reqValues.Add("me", me.String())
res, err := http.PostForm(endpoints.TokenEndpoint, reqValues)
req, err := http.NewRequest(http.MethodPost, endpoints.TokenEndpoint, strings.NewReader(reqValues.Encode()))
if err != nil {
return tokenResponse, err
}
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
req.Header.Add("Accept", "application/json")
defer res.Body.Close()
dec := json.NewDecoder(res.Body)
err = dec.Decode(&tokenResponse)
res, err := http.DefaultClient.Do(req)
if err != nil {
return tokenResponse, err
}
defer res.Body.Close()
if res.StatusCode != 200 {
return TokenResponse{}, fmt.Errorf("status code %d, instead of 200", res.StatusCode)
}
if strings.HasPrefix(res.Header.Get("content-type"), "application/json") {
dec := json.NewDecoder(res.Body)
err = dec.Decode(&tokenResponse)
if err != nil {
return tokenResponse, fmt.Errorf("error while parsing response body with content-type %s as json: %s", res.Header.Get("content-type"), err)
}
if tokenResponse.Me == "" && tokenResponse.Error != "" {
return tokenResponse, fmt.Errorf("received error from endpoint: %s, %s", tokenResponse.Error, tokenResponse.ErrorDescription)
}
} else if strings.HasPrefix(res.Header.Get("content-type"), "application/x-www-form-urlencoded") {
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return tokenResponse, fmt.Errorf("error while reading response body with content-type %s: %s", res.Header.Get("content-type"), err)
}
values, err := url.ParseQuery(string(body))
if err != nil {
return tokenResponse, fmt.Errorf("error while parsing response body with content-type %s as application/x-www-form-urlencoded: %s\nbody was: %q\n", res.Header.Get("content-type"), err, body)
}
if values.Get("me") == "" {
if errTxt := values.Get("error"); errTxt != "" {
return tokenResponse, fmt.Errorf("received error from endpoint: %s, %s", errTxt, values.Get("error_description"))
}
}
tokenResponse.Me = values.Get("me")
tokenResponse.AccessToken = values.Get("token")
tokenResponse.TokenType = values.Get("token_type")
tokenResponse.Scope = values.Get("scope")
}
return tokenResponse, nil
}