// retrieveToken takes a *Config and uses that to retrieve an *internal.Token. // This token is then mapped from *internal.Token into an *oauth2.Token which is // returned along with an error. func retrieveToken(ctx context.Context, c *Config, v url.Values) (*oauth2.Token, error) { tk, err := internal.RetrieveToken(ctx, c.ClientID, c.ClientSecret, c.TokenURL, v) if err != nil { return nil, err } return tokenFromInternal(tk), nil }
func (c *ExtendedOAuth2Config) ExchangeWithRefreshToken(ctx context.Context, refresh_token string) (*oauth2.Token, error) { v := url.Values{ "grant_type": {"refresh_token"}, "refresh_token": {refresh_token}, } t, err := internal.RetrieveToken(ctx, c.ClientID, c.ClientSecret, c.Endpoint.TokenURL, v) if err != nil { return nil, err } return tokenFromInternal(t), nil }
// Token refreshes the token by using a new client credentials request. // tokens received this way do not include a refresh token func (c *tokenSource) Token() (*oauth2.Token, error) { tk, err := internal.RetrieveToken(c.ctx, c.conf.ClientID, c.conf.ClientSecret, c.conf.TokenURL, url.Values{ "grant_type": {"client_credentials"}, "scope": internal.CondVal(strings.Join(c.conf.Scopes, " ")), }) if err != nil { return nil, err } t := &oauth2.Token{ AccessToken: tk.AccessToken, TokenType: tk.TokenType, RefreshToken: tk.RefreshToken, Expiry: tk.Expiry, } return t.WithExtra(tk.Raw), nil }