diff --git a/pkg/oidc/types.go b/pkg/oidc/types.go index 8423cff..86e5d06 100644 --- a/pkg/oidc/types.go +++ b/pkg/oidc/types.go @@ -60,8 +60,8 @@ type ResponseType string type Scopes []string -func (s *Scopes) Encode() string { - return strings.Join(*s, " ") +func (s Scopes) Encode() string { + return strings.Join(s, " ") } func (s *Scopes) UnmarshalText(text []byte) error { diff --git a/pkg/rp/relaying_party.go b/pkg/rp/relaying_party.go index a8bb9bb..6807221 100644 --- a/pkg/rp/relaying_party.go +++ b/pkg/rp/relaying_party.go @@ -5,10 +5,12 @@ import ( "errors" "net/http" "net/url" + "reflect" "strings" "time" "github.com/google/uuid" + "github.com/gorilla/schema" "github.com/caos/oidc/pkg/oidc" "github.com/caos/oidc/pkg/oidc/grants" @@ -24,6 +26,16 @@ const ( jwtProfileKey = "urn:ietf:params:oauth:grant-type:jwt-bearer" ) +var ( + encoder = func() utils.Encoder { + e := schema.NewEncoder() + e.RegisterEncoder(oidc.Scopes{}, func(value reflect.Value) string { + return value.Interface().(oidc.Scopes).Encode() + }) + return e + }() +) + //RelayingParty declares the minimal interface for oidc clients type RelayingParty interface { //OAuthConfig returns the oauth2 Config @@ -334,7 +346,7 @@ func CallTokenEndpoint(request interface{}, rp RelayingParty) (newToken *oauth2. } func callTokenEndpoint(request interface{}, authFn interface{}, rp RelayingParty) (newToken *oauth2.Token, err error) { - req, err := utils.FormRequest(rp.OAuthConfig().Endpoint.TokenURL, request, authFn) + req, err := utils.FormRequest(rp.OAuthConfig().Endpoint.TokenURL, request, encoder, authFn) if err != nil { return nil, err } diff --git a/pkg/utils/http.go b/pkg/utils/http.go index e785472..fa51815 100644 --- a/pkg/utils/http.go +++ b/pkg/utils/http.go @@ -10,8 +10,6 @@ import ( "net/url" "strings" "time" - - "github.com/gorilla/schema" ) var ( @@ -36,9 +34,8 @@ func AuthorizeBasic(user, password string) RequestAuthorization { } } -func FormRequest(endpoint string, request interface{}, authFn interface{}) (*http.Request, error) { +func FormRequest(endpoint string, request interface{}, encoder Encoder, authFn interface{}) (*http.Request, error) { form := url.Values{} - encoder := schema.NewEncoder() if err := encoder.Encode(request, form); err != nil { return nil, err }