+func (c *Client) revokeToken(ctx context.Context) error {
+ tok, err := c.appUser.Token(ctx, "Fitbit")
+ if err != nil {
+ return err
+ }
+
+ httpClient := urlfetch.Client(ctx)
+ httpClient.Transport = retry.NewTransport(httpClient.Transport)
+
+ url := "https://api.fitbit.com/oauth2/revoke?token=" + url.QueryEscape(tok.AccessToken)
+ req, err := http.NewRequest(http.MethodGet, url, nil)
+ if err != nil {
+ return err
+ }
+ req.Header.Set("Authorization", "Basic "+
+ base64.StdEncoding.EncodeToString([]byte(
+ app.Config.FitbitClientID+":"+app.Config.FitbitClientSecret)))
+
+ res, err := httpClient.Do(req)
+ if err != nil {
+ return fmt.Errorf("GET %s: %v", url, err)
+ }
+ defer res.Body.Close()
+
+ if res.StatusCode != http.StatusOK {
+ if data, err := ioutil.ReadAll(res.Body); err == nil {
+ return fmt.Errorf("GET %s: %s", url, data)
+ } else {
+ return fmt.Errorf("GET %s: %s", url, res.Status)
+ }
+ }
+
+ return nil
+}
+