11package oauth
22
33import (
4- "fmt"
54 "net/url"
5+ "strings"
66
77 "github.com/danielgtaylor/restish/cli"
88 "golang.org/x/oauth2"
@@ -17,6 +17,9 @@ type RefreshTokenSource struct {
1717 // TokenURL is used to fetch new tokens
1818 TokenURL string
1919
20+ // Scopes to request when refreshing the token
21+ Scopes []string
22+
2023 // EndpointParams are extra URL query parameters to include in the request
2124 EndpointParams * url.Values
2225
@@ -35,14 +38,21 @@ type RefreshTokenSource struct {
3538func (ts * RefreshTokenSource ) Token () (* oauth2.Token , error ) {
3639 if ts .RefreshToken != "" {
3740 cli .LogDebug ("Trying refresh token to get a new access token" )
38- payload := fmt .Sprintf ("grant_type=refresh_token&client_id=%s&refresh_token=%s" , ts .ClientID , ts .RefreshToken )
41+ refreshParams := url.Values {
42+ "grant_type" : []string {"refresh_token" },
43+ "client_id" : []string {ts .ClientID },
44+ "refresh_token" : []string {ts .RefreshToken },
45+ "scope" : []string {strings .Join (ts .Scopes , " " )},
46+ }
3947
40- params := ts .EndpointParams .Encode ()
41- if len (params ) > 0 {
42- payload += "&" + params
48+ // Copy any endpoint-specific parameters.
49+ if ts .EndpointParams != nil {
50+ for k , v := range * ts .EndpointParams {
51+ refreshParams [k ] = v
52+ }
4353 }
4454
45- token , err := requestToken (ts .TokenURL , payload )
55+ token , err := requestToken (ts .TokenURL , refreshParams . Encode () )
4656 if err == nil {
4757 return token , err
4858 }
0 commit comments