forked from mystiq/dex
The Client object on its own doesn't fully express everything about a single client, and so when loading clients from a static configuration it's not enough to just (de)serialize clients. To that end, LoadableClient contains the full representation of a client and associated entities.
91 lines
2.2 KiB
Go
91 lines
2.2 KiB
Go
package integration
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"net/http"
|
|
"net/url"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/coreos/dex/client"
|
|
schema "github.com/coreos/dex/schema/workerschema"
|
|
"github.com/coreos/go-oidc/oidc"
|
|
)
|
|
|
|
func TestClientCreate(t *testing.T) {
|
|
ci := client.Client{
|
|
// Credentials are for reference, they are actually generated by the client manager
|
|
Credentials: oidc.ClientCredentials{
|
|
ID: "authn.example.com",
|
|
Secret: base64.URLEncoding.EncodeToString([]byte("secret")),
|
|
},
|
|
Metadata: oidc.ClientMetadata{
|
|
RedirectURIs: []url.URL{
|
|
{Scheme: "https://", Host: "authn.example.com", Path: "/callback"},
|
|
},
|
|
},
|
|
}
|
|
cis := []client.LoadableClient{{Client: ci}}
|
|
|
|
srv, err := mockServer(cis)
|
|
if err != nil {
|
|
t.Fatalf("Unexpected error setting up server: %v", err)
|
|
}
|
|
|
|
oidcClient, err := mockClient(srv, ci)
|
|
if err != nil {
|
|
t.Fatalf("Unexpected error setting up OIDC client: %v", err)
|
|
}
|
|
|
|
tok, err := oidcClient.ClientCredsToken([]string{"openid"})
|
|
if err != nil {
|
|
t.Fatalf("Failed getting client token: %v", err)
|
|
}
|
|
|
|
callbackURL := "http://example.com/oidc/callback"
|
|
trans := &tokenHandlerTransport{
|
|
Handler: srv.HTTPHandler(),
|
|
Token: tok.Encode(),
|
|
}
|
|
hc := &http.Client{
|
|
Transport: trans,
|
|
}
|
|
iss := srv.IssuerURL.String()
|
|
svc, err := schema.NewWithBasePath(hc, iss)
|
|
if err != nil {
|
|
t.Fatalf("Failed creating API service client: %v", err)
|
|
}
|
|
|
|
newClientInput := &schema.Client{
|
|
RedirectURIs: []string{callbackURL, "http://example.com"},
|
|
}
|
|
|
|
call := svc.Clients.Create(newClientInput)
|
|
newClient, err := call.Do()
|
|
if err != nil {
|
|
t.Fatalf("Call to create client API failed: %v", err)
|
|
}
|
|
|
|
if newClient.Id == "" {
|
|
t.Error("Expected non-empty Client ID")
|
|
}
|
|
|
|
if newClient.Secret == "" {
|
|
t.Error("Expected non-empty Client Secret")
|
|
}
|
|
|
|
meta, err := srv.ClientManager.Metadata(newClient.Id)
|
|
if err != nil {
|
|
t.Errorf("Error looking up client metadata: %v", err)
|
|
} else if meta == nil {
|
|
t.Error("Expected new client to exist in repo")
|
|
}
|
|
|
|
gotURLs := make([]string, len(meta.RedirectURIs))
|
|
for i, u := range meta.RedirectURIs {
|
|
gotURLs[i] = u.String()
|
|
}
|
|
if !reflect.DeepEqual(newClientInput.RedirectURIs, gotURLs) {
|
|
t.Errorf("Callback URL mismatch, want=%s, got=%s", newClientInput.RedirectURIs, gotURLs)
|
|
}
|
|
}
|