Skip to content

oauth2: automatically retry token refreshes #226

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
broady opened this issue Apr 5, 2017 · 2 comments
Closed

oauth2: automatically retry token refreshes #226

broady opened this issue Apr 5, 2017 · 2 comments

Comments

@broady
Copy link
Contributor

broady commented Apr 5, 2017

Maybe only feasible for known token endpoints, but here's a token refresh request we could have retried:

oauth2: cannot fetch token: 502 Bad Gateway
		Response: <!DOCTYPE html>
		<html lang=en>
		  <meta charset=utf-8>
		  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
		  <title>Error 502 (Server Error)!!1</title>
		  <style>
		    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
		  </style>
		  <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
		  <p><b>502.</b> <ins>That’s an error.</ins>
		  <p>The server encountered a temporary error and could not complete your request.<p>Please try again in 30 seconds.  <ins>That’s all we know.</ins>
@dnesting
Copy link

This should be easy enough to implement using your own HTTP transport, something like:

type retryTransport struct {
  base http.RoundTripper
  shouldRetry func(err error, numRetries int) bool  // implementation here
}

func (t *retryTransport) RoundTrip(req *http.Request) (res *http.Response, err error) {
  res, err = base.RoundTrip(req)
  var numRetries int
  for err != nil && t.shouldRetry(err, numRetries) {
    numRetries++
    res, err = base.RoundTrip(req)
  }
}

func NewClient(config *oauth2.Config, token *oauth2.Token) *http.Client {
  base := &http.Client{
    Transport: &retryTransport{base: http.Default},
  }
  refreshCtx := context.WithValue(context.Background(), oauth2.HTTPClient, base)
  return oauth2.NewClient(context.Background(), config.TokenSource(refreshCtx, token))
}

@lpusok
Copy link

lpusok commented Sep 19, 2023

Is there a sane way to refresh a token on a given HTTP status code (specifically 401)?

@seankhliao seankhliao closed this as not planned Won't fix, can't repro, duplicate, stale Apr 18, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants