// getToken returns the token saved in the config file under // section name. func getToken(name string) (*oauth2.Token, error) { tokenString, err := fs.ConfigFile.GetValue(string(name), ConfigToken) if err != nil { return nil, err } if tokenString == "" { return nil, fmt.Errorf("Empty token found - please run rclone config again") } token := new(oauth2.Token) err = json.Unmarshal([]byte(tokenString), token) if err != nil { return nil, err } // if has data then return it if token.AccessToken != "" && token.RefreshToken != "" { return token, nil } // otherwise try parsing as oldToken oldtoken := new(oldToken) err = json.Unmarshal([]byte(tokenString), oldtoken) if err != nil { return nil, err } // Fill in result into new token token.AccessToken = oldtoken.AccessToken token.RefreshToken = oldtoken.RefreshToken token.Expiry = oldtoken.Expiry // Save new format in config file err = putToken(name, token) if err != nil { return nil, err } return token, nil }
func newTokenFromRefreshToken(refreshToken string) (*oauth2.Token, error) { token := new(oauth2.Token) token.RefreshToken = refreshToken token.Expiry = time.Now() // TokenSource will refresh the token if needed (which is likely in this // use case) oauthConfig := *googleOauthConfig ts := oauthConfig.TokenSource(oauth2.NoContext, token) return ts.Token() }
func GetSpotifyClient(clientID, clientSecret, refreshToken string) *spotify.Client { // So as not to introduce a web flow into this program, we cheat a bit here // by just using a refresh token and not an access token (because access // tokens expiry very quickly and are therefore not suitable for inclusion // in configuration). This will force a refresh on the first call, but meh. token := new(oauth2.Token) token.Expiry = time.Now().Add(time.Second * -1) token.RefreshToken = refreshToken // See comment above. We've already procured the first access/refresh token // pair outside of this program, so no redirect URL is necessary. authenticator := spotify.NewAuthenticator("no-redirect-url") authenticator.SetAuthInfo(clientID, clientSecret) client := authenticator.NewClient(token) return &client }
// decodeToken parses an access token, refresh token, and optional // expiry unix timestamp separated by spaces into an oauth2.Token. // It returns as much as it can. func decodeToken(encoded string) *oauth2.Token { t := new(oauth2.Token) f := strings.Fields(encoded) if len(f) > 0 { t.AccessToken = f[0] } if len(f) > 1 { t.RefreshToken = f[1] } if len(f) > 2 && f[2] != "0" { sec, err := strconv.ParseInt(f[2], 10, 64) if err == nil { t.Expiry = time.Unix(sec, 0) } } return t }