git.iko.soy/typeable/oauth2-proxy
on master help sign in
Migrate all requests to result pattern
commitde9e65a63adf43778a5478c9e331a8fcd71b7f56 authorJoel Speed <joel.speed@hotmail.co.uk> dateMon 6 Jul 2020, 17:42 (6 years ago) parentd0b6c04
15 files changed+46−50
pkg/validation/options.go+2−3 providers/azure.go+2 providers/bitbucket.go+3 providers/digitalocean.go+1 providers/facebook.go+1 providers/github.go+16−18 providers/gitlab.go+1 providers/google.go+2 providers/internal_util.go+6−9 providers/keycloak.go+1 providers/linkedin.go+1 providers/logingov.go+2 providers/nextcloud.go+1 providers/oidc.go+1 providers/provider_default.go+6−20
pkg/validation/options.go+2−3
@@ -86,6 +86,7 @@ func Validate(o *options.Options) error {
8686 requestURL := strings.TrimSuffix(o.OIDCIssuerURL, "/") + "/.well-known/openid-configuration"
8787 body, err := requests.New(requestURL).
8888 WithContext(ctx).
89+ Do().
8990 UnmarshalJSON()
9091 if err != nil {
9192 logger.Printf("error: failed to discover OIDC configuration: %v", err)
@@ -384,11 +385,9 @@ func newVerifierFromJwtIssuer(jwtIssuer jwtIssuer) (*oidc.IDTokenVerifier, error
384385 if err != nil {
385386 // Try as JWKS URI
386387 jwksURI := strings.TrimSuffix(jwtIssuer.issuerURI, "/") + "/.well-known/jwks.json"
387− resp, err := requests.New(jwksURI).Do()
388− if err != nil {
388+ if err := requests.New(jwksURI).Do().Error(); err != nil {
389389 return nil, err
390390 }
391− resp.Body.Close()
392391
393392 verifier = oidc.NewVerifier(jwtIssuer.issuerURI, oidc.NewRemoteKeySet(context.Background(), jwksURI), config)
394393 } else {
providers/azure.go+2
@@ -101,6 +101,7 @@ func (p *AzureProvider) Redeem(ctx context.Context, redirectURL, code string) (s
101101 WithMethod("POST").
102102 WithBody(bytes.NewBufferString(params.Encode())).
103103 SetHeader("Content-Type", "application/x-www-form-urlencoded").
104+ Do().
104105 UnmarshalInto(&jsonResponse)
105106 if err != nil {
106107 return nil, err
@@ -153,6 +154,7 @@ func (p *AzureProvider) GetEmailAddress(ctx context.Context, s *sessions.Session
153154 json, err := requests.New(p.ProfileURL.String()).
154155 WithContext(ctx).
155156 WithHeaders(getAzureHeader(s.AccessToken)).
157+ Do().
156158 UnmarshalJSON()
157159 if err != nil {
158160 return "", err
providers/bitbucket.go+3
@@ -88,6 +88,7 @@ func (p *BitbucketProvider) GetEmailAddress(ctx context.Context, s *sessions.Ses
8888 requestURL := p.ValidateURL.String() + "?access_token=" + s.AccessToken
8989 err := requests.New(requestURL).
9090 WithContext(ctx).
91+ Do().
9192 UnmarshalInto(&emails)
9293 if err != nil {
9394 logger.Printf("failed making request: %v", err)
@@ -103,6 +104,7 @@ func (p *BitbucketProvider) GetEmailAddress(ctx context.Context, s *sessions.Ses
103104
104105 err := requests.New(requestURL).
105106 WithContext(ctx).
107+ Do().
106108 UnmarshalInto(&teams)
107109 if err != nil {
108110 logger.Printf("failed requesting teams membership: %v", err)
@@ -132,6 +134,7 @@ func (p *BitbucketProvider) GetEmailAddress(ctx context.Context, s *sessions.Ses
132134
133135 err := requests.New(requestURL).
134136 WithContext(ctx).
137+ Do().
135138 UnmarshalInto(&repositories)
136139 if err != nil {
137140 logger.Printf("failed checking repository access: %v", err)
providers/digitalocean.go+1
@@ -64,6 +64,7 @@ func (p *DigitalOceanProvider) GetEmailAddress(ctx context.Context, s *sessions.
6464 json, err := requests.New(p.ProfileURL.String()).
6565 WithContext(ctx).
6666 WithHeaders(getDigitalOceanHeader(s.AccessToken)).
67+ Do().
6768 UnmarshalJSON()
6869 if err != nil {
6970 return "", err
providers/facebook.go+1
@@ -72,6 +72,7 @@ func (p *FacebookProvider) GetEmailAddress(ctx context.Context, s *sessions.Sess
7272 err := requests.New(requestURL).
7373 WithContext(ctx).
7474 WithHeaders(getFacebookHeader(s.AccessToken)).
75+ Do().
7576 UnmarshalInto(&r)
7677 if err != nil {
7778 return "", err
providers/github.go+16−18
@@ -4,7 +4,6 @@ import (
44 "context"
55 "errors"
66 "fmt"
7− "io/ioutil"
87 "net/http"
98 "net/url"
109 "path"
@@ -116,6 +115,7 @@ func (p *GitHubProvider) hasOrg(ctx context.Context, accessToken string) (bool,
116115 err := requests.New(endpoint.String()).
117116 WithContext(ctx).
118117 WithHeaders(getGitHubHeader(accessToken)).
118+ Do().
119119 UnmarshalInto(&op)
120120 if err != nil {
121121 return false, err
@@ -179,12 +179,12 @@ func (p *GitHubProvider) hasOrgAndTeam(ctx context.Context, accessToken string)
179179 // bodyclose cannot detect that the body is being closed later in requests.Into,
180180 // so have to skip the linting for the next line.
181181 // nolint:bodyclose
182− resp, err := requests.New(endpoint.String()).
182+ result := requests.New(endpoint.String()).
183183 WithContext(ctx).
184184 WithHeaders(getGitHubHeader(accessToken)).
185185 Do()
186− if err != nil {
187− return false, err
186+ if result.Error() != nil {
187+ return false, result.Error()
188188 }
189189
190190 if last == 0 {
@@ -200,7 +200,7 @@ func (p *GitHubProvider) hasOrgAndTeam(ctx context.Context, accessToken string)
200200 // link header at last page (doesn't exist last info)
201201 // <https://api.github.com/user/teams?page=3&per_page=10>; rel="prev", <https://api.github.com/user/teams?page=1&per_page=10>; rel="first"
202202
203− link := resp.Header.Get("Link")
203+ link := result.Headers().Get("Link")
204204 rep1 := regexp.MustCompile(`(?s).*\<https://api.github.com/user/teams\?page=(.)&per_page=[0-9]+\>; rel="last".*`)
205205 i, converr := strconv.Atoi(rep1.ReplaceAllString(link, "$1"))
206206
@@ -211,7 +211,7 @@ func (p *GitHubProvider) hasOrgAndTeam(ctx context.Context, accessToken string)
211211 }
212212
213213 var tp teamsPage
214− if err := requests.UnmarshalInto(resp, &tp); err != nil {
214+ if err := result.UnmarshalInto(&tp); err != nil {
215215 return false, err
216216 }
217217 if len(tp) == 0 {
@@ -282,6 +282,7 @@ func (p *GitHubProvider) hasRepo(ctx context.Context, accessToken string) (bool,
282282 err := requests.New(endpoint.String()).
283283 WithContext(ctx).
284284 WithHeaders(getGitHubHeader(accessToken)).
285+ Do().
285286 UnmarshalInto(&repo)
286287 if err != nil {
287288 return false, err
@@ -309,6 +310,7 @@ func (p *GitHubProvider) hasUser(ctx context.Context, accessToken string) (bool,
309310 err := requests.New(endpoint.String()).
310311 WithContext(ctx).
311312 WithHeaders(getGitHubHeader(accessToken)).
313+ Do().
312314 UnmarshalInto(&user)
313315 if err != nil {
314316 return false, err
@@ -328,26 +330,20 @@ func (p *GitHubProvider) isCollaborator(ctx context.Context, username, accessTok
328330 Host: p.ValidateURL.Host,
329331 Path: path.Join(p.ValidateURL.Path, "/repos/", p.Repo, "/collaborators/", username),
330332 }
331− resp, err := requests.New(endpoint.String()).
333+ result := requests.New(endpoint.String()).
332334 WithContext(ctx).
333335 WithHeaders(getGitHubHeader(accessToken)).
334336 Do()
335− if err != nil {
336− return false, err
337− }
338−
339− body, err := ioutil.ReadAll(resp.Body)
340− resp.Body.Close()
341− if err != nil {
342− return false, err
337+ if result.Error() != nil {
338+ return false, result.Error()
343339 }
344340
345− if resp.StatusCode != 204 {
341+ if result.StatusCode() != 204 {
346342 return false, fmt.Errorf("got %d from %q %s",
347− resp.StatusCode, endpoint.String(), body)
343+ result.StatusCode(), endpoint.String(), result.Body())
348344 }
349345
350− logger.Printf("got %d from %q %s", resp.StatusCode, endpoint.String(), body)
346+ logger.Printf("got %d from %q %s", result.StatusCode(), endpoint.String(), result.Body())
351347
352348 return true, nil
353349}
@@ -401,6 +397,7 @@ func (p *GitHubProvider) GetEmailAddress(ctx context.Context, s *sessions.Sessio
401397 err := requests.New(endpoint.String()).
402398 WithContext(ctx).
403399 WithHeaders(getGitHubHeader(s.AccessToken)).
400+ Do().
404401 UnmarshalInto(&emails)
405402 if err != nil {
406403 return "", err
@@ -435,6 +432,7 @@ func (p *GitHubProvider) GetUserName(ctx context.Context, s *sessions.SessionSta
435432 err := requests.New(endpoint.String()).
436433 WithContext(ctx).
437434 WithHeaders(getGitHubHeader(s.AccessToken)).
435+ Do().
438436 UnmarshalInto(&user)
439437 if err != nil {
440438 return "", err
providers/gitlab.go+1
@@ -133,6 +133,7 @@ func (p *GitLabProvider) getUserInfo(ctx context.Context, s *sessions.SessionSta
133133 err := requests.New(userInfoURL.String()).
134134 WithContext(ctx).
135135 SetHeader("Authorization", "Bearer "+s.AccessToken).
136+ Do().
136137 UnmarshalInto(&userInfo)
137138 if err != nil {
138139 return nil, fmt.Errorf("error getting user info: %v", err)
providers/google.go+2
@@ -129,6 +129,7 @@ func (p *GoogleProvider) Redeem(ctx context.Context, redirectURL, code string) (
129129 WithMethod("POST").
130130 WithBody(bytes.NewBufferString(params.Encode())).
131131 SetHeader("Content-Type", "application/x-www-form-urlencoded").
132+ Do().
132133 UnmarshalInto(&jsonResponse)
133134 if err != nil {
134135 return nil, err
@@ -280,6 +281,7 @@ func (p *GoogleProvider) redeemRefreshToken(ctx context.Context, refreshToken st
280281 WithMethod("POST").
281282 WithBody(bytes.NewBufferString(params.Encode())).
282283 SetHeader("Content-Type", "application/x-www-form-urlencoded").
284+ Do().
283285 UnmarshalInto(&data)
284286 if err != nil {
285287 return "", "", 0, err
providers/internal_util.go+6−9
@@ -2,7 +2,6 @@ package providers
22
33import (
44 "context"
5− "io/ioutil"
65 "net/http"
76 "net/url"
87
@@ -57,23 +56,21 @@ func validateToken(ctx context.Context, p Provider, accessToken string, header h
5756 endpoint = endpoint + "?" + params.Encode()
5857 }
5958
60− resp, err := requests.New(endpoint).
59+ result := requests.New(endpoint).
6160 WithContext(ctx).
6261 WithHeaders(header).
6362 Do()
64− if err != nil {
63+ if result.Error() != nil {
6564 logger.Printf("GET %s", stripToken(endpoint))
66− logger.Printf("token validation request failed: %s", err)
65+ logger.Printf("token validation request failed: %s", result.Error())
6766 return false
6867 }
6968
70− body, _ := ioutil.ReadAll(resp.Body)
71− resp.Body.Close()
72− logger.Printf("%d GET %s %s", resp.StatusCode, stripToken(endpoint), body)
69+ logger.Printf("%d GET %s %s", result.StatusCode(), stripToken(endpoint), result.Body())
7370
74− if resp.StatusCode == 200 {
71+ if result.StatusCode() == 200 {
7572 return true
7673 }
77− logger.Printf("token validation request failed: status %d - %s", resp.StatusCode, body)
74+ logger.Printf("token validation request failed: status %d - %s", result.StatusCode(), result.Body())
7875 return false
7976}
providers/keycloak.go+1
@@ -53,6 +53,7 @@ func (p *KeycloakProvider) GetEmailAddress(ctx context.Context, s *sessions.Sess
5353 json, err := requests.New(p.ValidateURL.String()).
5454 WithContext(ctx).
5555 SetHeader("Authorization", "Bearer "+s.AccessToken).
56+ Do().
5657 UnmarshalJSON()
5758 if err != nil {
5859 logger.Printf("failed making request %s", err)
providers/linkedin.go+1
@@ -63,6 +63,7 @@ func (p *LinkedInProvider) GetEmailAddress(ctx context.Context, s *sessions.Sess
6363 json, err := requests.New(requestURL).
6464 WithContext(ctx).
6565 WithHeaders(getLinkedInHeader(s.AccessToken)).
66+ Do().
6667 UnmarshalJSON()
6768 if err != nil {
6869 return "", err
providers/logingov.go+2
@@ -141,6 +141,7 @@ func emailFromUserInfo(ctx context.Context, accessToken string, userInfoEndpoint
141141 err := requests.New(userInfoEndpoint).
142142 WithContext(ctx).
143143 SetHeader("Authorization", "Bearer "+accessToken).
144+ Do().
144145 UnmarshalInto(&emailData)
145146 if err != nil {
146147 return "", err
@@ -196,6 +197,7 @@ func (p *LoginGovProvider) Redeem(ctx context.Context, redirectURL, code string)
196197 WithMethod("POST").
197198 WithBody(bytes.NewBufferString(params.Encode())).
198199 SetHeader("Content-Type", "application/x-www-form-urlencoded").
200+ Do().
199201 UnmarshalInto(&jsonResponse)
200202 if err != nil {
201203 return nil, err
providers/nextcloud.go+1
@@ -33,6 +33,7 @@ func (p *NextcloudProvider) GetEmailAddress(ctx context.Context, s *sessions.Ses
3333 json, err := requests.New(p.ValidateURL.String()).
3434 WithContext(ctx).
3535 WithHeaders(getNextcloudHeader(s.AccessToken)).
36+ Do().
3637 UnmarshalJSON()
3738 if err != nil {
3839 return "", fmt.Errorf("error making request: %v", err)
providers/oidc.go+1
@@ -259,6 +259,7 @@ func (p *OIDCProvider) findClaimsFromIDToken(ctx context.Context, idToken *oidc.
259259 respJSON, err := requests.New(profileURL).
260260 WithContext(ctx).
261261 WithHeaders(getOIDCHeader(accessToken)).
262+ Do().
262263 UnmarshalJSON()
263264 if err != nil {
264265 return nil, err
providers/provider_default.go+6−20
@@ -3,10 +3,8 @@ package providers
33import (
44 "bytes"
55 "context"
6− "encoding/json"
76 "errors"
87 "fmt"
9− "io/ioutil"
108 "net/url"
119 "time"
1210
@@ -39,33 +37,21 @@ func (p *ProviderData) Redeem(ctx context.Context, redirectURL, code string) (s
3937 params.Add("resource", p.ProtectedResource.String())
4038 }
4139
42− resp, err := requests.New(p.RedeemURL.String()).
40+ result := requests.New(p.RedeemURL.String()).
4341 WithContext(ctx).
4442 WithMethod("POST").
4543 WithBody(bytes.NewBufferString(params.Encode())).
4644 SetHeader("Content-Type", "application/x-www-form-urlencoded").
4745 Do()
48− if err != nil {
49− return nil, err
50− }
51−
52− var body []byte
53− body, err = ioutil.ReadAll(resp.Body)
54− resp.Body.Close()
55− if err != nil {
56− return
57− }
58−
59− if resp.StatusCode != 200 {
60− err = fmt.Errorf("got %d from %q %s", resp.StatusCode, p.RedeemURL.String(), body)
61− return
46+ if result.Error() != nil {
47+ return nil, result.Error()
6248 }
6349
6450 // blindly try json and x-www-form-urlencoded
6551 var jsonResponse struct {
6652 AccessToken string `json:"access_token"`
6753 }
68− err = json.Unmarshal(body, &jsonResponse)
54+ err = result.UnmarshalInto(&jsonResponse)
6955 if err == nil {
7056 s = &sessions.SessionState{
7157 AccessToken: jsonResponse.AccessToken,
@@ -74,7 +60,7 @@ func (p *ProviderData) Redeem(ctx context.Context, redirectURL, code string) (s
7460 }
7561
7662 var v url.Values
77− v, err = url.ParseQuery(string(body))
63+ v, err = url.ParseQuery(string(result.Body()))
7864 if err != nil {
7965 return
8066 }
@@ -82,7 +68,7 @@ func (p *ProviderData) Redeem(ctx context.Context, redirectURL, code string) (s
8268 created := time.Now()
8369 s = &sessions.SessionState{AccessToken: a, CreatedAt: &created}
8470 } else {
85− err = fmt.Errorf("no access token found %s", body)
71+ err = fmt.Errorf("no access token found %s", result.Body())
8672 }
8773 return
8874}