From 32db53ef5527a4261a5a52595ee079d5413301a7 Mon Sep 17 00:00:00 2001 From: Andrew Gerrand Date: Mon, 1 Sep 2014 14:39:59 +1000 Subject: [PATCH 1/3] better error handling in JWT fetchtoken --- jwt.go | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/jwt.go b/jwt.go index e34ef8c..f28ff39 100644 --- a/jwt.go +++ b/jwt.go @@ -10,6 +10,8 @@ import ( "encoding/json" "encoding/pem" "errors" + "fmt" + "io/ioutil" "net/http" "net/url" "strings" @@ -95,7 +97,7 @@ func (c *JWTConfig) NewTransportWithUser(user string) *Transport { // fetchToken retrieves a new access token and updates the existing token // with the newly fetched credentials. -func (c *JWTConfig) FetchToken(existing *Token) (token *Token, err error) { +func (c *JWTConfig) FetchToken(existing *Token) (*Token, error) { if existing == nil { existing = &Token{} } @@ -115,7 +117,7 @@ func (c *JWTConfig) FetchToken(existing *Token) (token *Token, err error) { payload, err := jws.Encode(defaultHeader, claimSet, c.key) if err != nil { - return + return nil, err } v := url.Values{} v.Set("grant_type", defaultGrantType) @@ -124,22 +126,23 @@ func (c *JWTConfig) FetchToken(existing *Token) (token *Token, err error) { // Make a request with assertion to get a new token. resp, err := c.Client.PostForm(c.aud.String(), v) if err != nil { - return nil, err + return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) } - defer resp.Body.Close() - if resp.StatusCode != 200 { - // TODO(jbd): Provide more context about the response. - return nil, errors.New("Cannot fetch token, response: " + resp.Status) + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) + } + if c := resp.StatusCode; c < 200 || c > 299 { + return nil, fmt.Errorf("oauth2: cannot fetch token: %v\nResponse: %s", resp.Status, body) } b := &tokenRespBody{} - err = json.NewDecoder(resp.Body).Decode(b) - if err != nil { - return nil, err + if err := json.Unmarshal(body, b); err != nil { + return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) } - token = &Token{ + token := &Token{ AccessToken: b.AccessToken, TokenType: b.TokenType, Subject: existing.Subject, @@ -150,14 +153,14 @@ func (c *JWTConfig) FetchToken(existing *Token) (token *Token, err error) { claimSet := &jws.ClaimSet{} claimSet, err = jws.Decode(b.IdToken) if err != nil { - return + return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) } token.Expiry = time.Unix(claimSet.Exp, 0) - return + return token, nil } token.Expiry = time.Now().Add(time.Duration(b.ExpiresIn) * time.Second) - return + return token, nil } // parseKey converts the binary contents of a private key file From e049d530c378d6654922f253afe9f1867c11377c Mon Sep 17 00:00:00 2001 From: Alif Rachmawadi Date: Tue, 2 Sep 2014 21:17:45 +0700 Subject: [PATCH 2/3] fixed NewTransport example code --- oauth2.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oauth2.go b/oauth2.go index 6441316..573e87a 100644 --- a/oauth2.go +++ b/oauth2.go @@ -162,7 +162,7 @@ func (c *Config) AuthCodeURL(state string) (authURL string) { // refresh token) in order to be able to do authorized requests. // // Example: -// t, _ := c.NewTransport() +// t := c.NewTransport() // t.SetToken(validToken) // func (c *Config) NewTransport() *Transport { From eae9d0e836ee3052640365a99e36968cea0dfab0 Mon Sep 17 00:00:00 2001 From: Alif Rachmawadi Date: Wed, 3 Sep 2014 08:27:29 +0700 Subject: [PATCH 3/3] removed NewTransport inline example --- oauth2.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/oauth2.go b/oauth2.go index 573e87a..e41ed59 100644 --- a/oauth2.go +++ b/oauth2.go @@ -160,11 +160,6 @@ func (c *Config) AuthCodeURL(state string) (authURL string) { // initialize the new transport with a token, so after creation, // you need to set a valid token (or an expired token with a valid // refresh token) in order to be able to do authorized requests. -// -// Example: -// t := c.NewTransport() -// t.SetToken(validToken) -// func (c *Config) NewTransport() *Transport { return NewTransport(c.Transport, c, nil) }