From e38356074e43377c256ca0cefe9a413f3435c6de Mon Sep 17 00:00:00 2001 From: Simon Murray Date: Fri, 24 Jan 2025 12:10:19 +0000 Subject: [PATCH] Make Login Provider List Dynamic (#158) This has been hard coded for far too long, make it dynamic based on what providers are available. Also preemptively fix a some bugs in the oauth2 provider lookup function. --- charts/identity/Chart.yaml | 4 +- pkg/oauth2/oauth2.go | 77 +++++- pkg/openapi/schema.go | 446 +++++++++++++++++------------------ pkg/openapi/server.spec.yaml | 1 + pkg/openapi/types.go | 1 + 5 files changed, 293 insertions(+), 236 deletions(-) diff --git a/charts/identity/Chart.yaml b/charts/identity/Chart.yaml index 2e0537f..28ba65a 100644 --- a/charts/identity/Chart.yaml +++ b/charts/identity/Chart.yaml @@ -4,8 +4,8 @@ description: A Helm chart for deploying Unikorn's IdP type: application -version: v0.2.52-rc3 -appVersion: v0.2.52-rc3 +version: v0.2.52-rc4 +appVersion: v0.2.52-rc4 icon: https://raw.githubusercontent.com/unikorn-cloud/assets/main/images/logos/dark-on-light/icon.png diff --git a/pkg/oauth2/oauth2.go b/pkg/oauth2/oauth2.go index 32b82b4..9d97710 100644 --- a/pkg/oauth2/oauth2.go +++ b/pkg/oauth2/oauth2.go @@ -57,6 +57,7 @@ import ( var ( ErrUnsupportedProviderType = goerrors.New("unhandled provider type") + ErrReference = goerrors.New("resource reference error") ErrUserNotDomainMapped = goerrors.New("user is not domain mapped to an organization") ErrEmailLookup = goerrors.New("failed to lookup email") ) @@ -403,12 +404,18 @@ func (a *Authenticator) Authorization(w http.ResponseWriter, r *http.Request) { return } + supportedTypes, err := a.getProviderTypes(r.Context()) + if err != nil { + authorizationError(w, r, client.Spec.RedirectURI, ErrorServerError, "failed to get oauth2 providers") + return + } + loginQuery := url.Values{} loginQuery.Set("state", state) loginQuery.Set("callback", "https://"+r.Host+"/oauth2/v2/login") // TODO: this needs to be driven by the available oauth2providers - loginQuery.Set("providers", "google microsoft github") + loginQuery.Set("providers", strings.Join(supportedTypes, " ")) // Redirect to an external login handler, if you have chosen to. if client.Spec.LoginURI != nil { @@ -461,11 +468,38 @@ func (a *Authenticator) lookupOrganization(ctx context.Context, email string) (* return nil, ErrUserNotDomainMapped } +// getProviders lists all identity providers. +func (a *Authenticator) getProviders(ctx context.Context) (*unikornv1.OAuth2ProviderList, error) { + resources := &unikornv1.OAuth2ProviderList{} + + if err := a.client.List(ctx, resources, &client.ListOptions{Namespace: a.namespace}); err != nil { + return nil, err + } + + return resources, nil +} + +func (a *Authenticator) getProviderTypes(ctx context.Context) ([]string, error) { + resources, err := a.getProviders(ctx) + if err != nil { + return nil, err + } + + result := make([]string, 0, len(resources.Items)) + + for _, resource := range resources.Items { + if resource.Spec.Type != nil && *resource.Spec.Type != "" { + result = append(result, string(*resource.Spec.Type)) + } + } + + return result, nil +} + // lookupProviderByType finds the provider configuration by the type chosen by the user. func (a *Authenticator) lookupProviderByType(ctx context.Context, t unikornv1.IdentityProviderType) (*unikornv1.OAuth2Provider, error) { - var resources unikornv1.OAuth2ProviderList - - if err := a.client.List(ctx, &resources, &client.ListOptions{Namespace: a.namespace}); err != nil { + resources, err := a.getProviders(ctx) + if err != nil { return nil, err } @@ -479,14 +513,35 @@ func (a *Authenticator) lookupProviderByType(ctx context.Context, t unikornv1.Id } // lookupProviderByID finds the provider based on ID. -func (a *Authenticator) lookupProviderByID(ctx context.Context, id string) (*unikornv1.OAuth2Provider, error) { - var providerResource unikornv1.OAuth2Provider +func (a *Authenticator) lookupProviderByID(ctx context.Context, id string, organization *unikornv1.Organization) (*unikornv1.OAuth2Provider, error) { + providers := &unikornv1.OAuth2ProviderList{} - if err := a.client.Get(ctx, client.ObjectKey{Namespace: a.namespace, Name: id}, &providerResource); err != nil { + if err := a.client.List(ctx, providers); err != nil { return nil, err } - return &providerResource, nil + find := func(provider unikornv1.OAuth2Provider) bool { + return provider.Name == id + } + + index := slices.IndexFunc(providers.Items, find) + if index < 0 { + return nil, fmt.Errorf("%w: requested provider does not exist", ErrReference) + } + + provider := &providers.Items[index] + + // If the provider is neither global, nor scoped to the provided organization, reject. + // NOTE: when called by the authorization endpoint and an email is provided, that email + // maps to an organization, and the provider must be in that organization to avoid + // jailbreaking. In later provider authorization and token exchanges we can trust the + // ID as it's already been checked and it has been cryptographically protected against + // tamering. + if provider.Namespace != a.namespace && (organization == nil || provider.Namespace != organization.Status.Namespace) { + return nil, fmt.Errorf("%w: requested provider not allowed", ErrReference) + } + + return provider, nil } // newOIDCProvider abstracts away any hacks for specific providers. @@ -640,7 +695,7 @@ func (a *Authenticator) Login(w http.ResponseWriter, r *http.Request) { return } - provider, err := a.lookupProviderByID(r.Context(), *organization.Spec.ProviderID) + provider, err := a.lookupProviderByID(r.Context(), *organization.Spec.ProviderID, organization) if err != nil { authorizationError(w, r, query.Get("redirect_uri"), ErrorServerError, err.Error()) return @@ -886,7 +941,7 @@ func (a *Authenticator) Callback(w http.ResponseWriter, r *http.Request) { return } - provider, err := a.lookupProviderByID(r.Context(), state.OAuth2Provider) + provider, err := a.lookupProviderByID(r.Context(), state.OAuth2Provider, nil) if err != nil { authorizationError(w, r, state.ClientRedirectURI, ErrorServerError, "failed to get oauth2 provider") return @@ -1136,7 +1191,7 @@ func (a *Authenticator) TokenRefreshToken(w http.ResponseWriter, r *http.Request // Lookup the provider details, then do a token refresh against that to update // the access token. - provider, err := a.lookupProviderByID(r.Context(), claims.Custom.Provider) + provider, err := a.lookupProviderByID(r.Context(), claims.Custom.Provider, nil) if err != nil { return nil, err } diff --git a/pkg/openapi/schema.go b/pkg/openapi/schema.go index c7cb112..b6cb1c1 100644 --- a/pkg/openapi/schema.go +++ b/pkg/openapi/schema.go @@ -19,229 +19,229 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "m2EcAQA=", + "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", + "AP//BtMbwGocAQA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/pkg/openapi/server.spec.yaml b/pkg/openapi/server.spec.yaml index 371a0ff..27db344 100644 --- a/pkg/openapi/server.spec.yaml +++ b/pkg/openapi/server.spec.yaml @@ -1067,6 +1067,7 @@ components: enum: - google - microsoft + - github oauth2ProviderSpec: description: An oauth2 provider. type: object diff --git a/pkg/openapi/types.go b/pkg/openapi/types.go index 0b0f1ed..174926a 100644 --- a/pkg/openapi/types.go +++ b/pkg/openapi/types.go @@ -59,6 +59,7 @@ const ( // Defines values for Oauth2ProviderType. const ( + Github Oauth2ProviderType = "github" Google Oauth2ProviderType = "google" Microsoft Oauth2ProviderType = "microsoft" )