Skip to content

Commit ac5f95c

Browse files
Merge pull request #278 from rest-sh/refresh-scopes
fix: send scopes on refresh token requests
2 parents fed5671 + 29dae90 commit ac5f95c

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

oauth/authcode.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ func (h *AuthorizationCodeHandler) OnRequest(request *http.Request, key string,
373373
refreshSource := RefreshTokenSource{
374374
ClientID: params["client_id"],
375375
TokenURL: params["token_url"],
376+
Scopes: strings.Split(params["scopes"], ","),
376377
EndpointParams: &endpointParams,
377378
RefreshToken: cli.Cache.GetString(refreshKey),
378379
TokenSource: source,

oauth/refresh.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package oauth
22

33
import (
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 {
3538
func (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

Comments
 (0)