Skip to content

Commit 0bf2e51

Browse files
committed
WIP: move around oauth metadata creation
Signed-off-by: Simo Sorce <[email protected]>
1 parent 6affc41 commit 0bf2e51

File tree

7 files changed

+63
-57
lines changed

7 files changed

+63
-57
lines changed

pkg/authorization/authorizer/scope/converter.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,19 @@ func DefaultSupportedScopesMap() map[string]string {
150150
return defaultSupportedScopesMap
151151
}
152152

153+
func DescribeScopes(scopes []string) map[string]string {
154+
ret := map[string]string{}
155+
for _, s := range scopes {
156+
val, ok := defaultSupportedScopesMap[s]
157+
if ok {
158+
ret[s] = val
159+
} else {
160+
ret[s] = ""
161+
}
162+
}
163+
return ret
164+
}
165+
153166
// user:<scope name>
154167
type userEvaluator struct{}
155168

pkg/cmd/server/apis/config/validation/master.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ func ValidateDeprecatedClusterNetworkConfig(config *configapi.MasterConfig, fldP
769769
func ValidateExternalOAuthConfig(config *configapi.ExternalOAuthConfig, fldPath *field.Path) ValidationResults {
770770
validationResults := ValidationResults{}
771771

772-
_, err := oauthutil.LoadOAuthMetadataFile(config.MetadataFile)
772+
_, _, err := oauthutil.LoadOAuthMetadataFile(config.MetadataFile)
773773
if err != nil {
774774
validationResults.AddErrors(field.Invalid(fldPath.Child("metadataFile"), config.MetadataFile, fmt.Sprintf("Metadata validation failed: %v", err)))
775775
}

pkg/cmd/server/kubernetes/master/master_config.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -598,23 +598,22 @@ func defaultOpenAPIConfig(config configapi.MasterConfig) *openapicommon.Config {
598598
},
599599
}
600600
}
601-
if config.OAuthConfig != nil {
602-
baseUrl := config.OAuthConfig.MasterPublicURL
601+
if _, oauthMetadata, _ := oauthutil.PrepOauthMetadata(config); oauthMetadata != nil {
603602
securityDefinitions["Oauth2Implicit"] = &spec.SecurityScheme{
604603
SecuritySchemeProps: spec.SecuritySchemeProps{
605604
Type: "oauth2",
606605
Flow: "implicit",
607-
AuthorizationURL: oauthutil.OpenShiftOAuthAuthorizeURL(baseUrl),
608-
Scopes: scope.DefaultSupportedScopesMap(),
606+
AuthorizationURL: oauthMetadata.AuthorizationEndpoint,
607+
Scopes: scope.DescribeScopes(oauthMetadata.ScopesSupported),
609608
},
610609
}
611610
securityDefinitions["Oauth2AccessToken"] = &spec.SecurityScheme{
612611
SecuritySchemeProps: spec.SecuritySchemeProps{
613612
Type: "oauth2",
614613
Flow: "accessCode",
615-
AuthorizationURL: oauthutil.OpenShiftOAuthAuthorizeURL(baseUrl),
616-
TokenURL: oauthutil.OpenShiftOAuthTokenURL(baseUrl),
617-
Scopes: scope.DefaultSupportedScopesMap(),
614+
AuthorizationURL: oauthMetadata.AuthorizationEndpoint,
615+
TokenURL: oauthMetadata.TokenEndpoint,
616+
Scopes: scope.DescribeScopes(oauthMetadata.ScopesSupported),
618617
},
619618
}
620619
}

pkg/cmd/server/origin/master.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -75,24 +75,20 @@ func (c *MasterConfig) newOpenshiftAPIConfig(kubeAPIServerConfig apiserver.Confi
7575
return ret, ret.ExtraConfig.Validate()
7676
}
7777

78-
func (c *MasterConfig) newOpenshiftNonAPIConfig(kubeAPIServerConfig apiserver.Config) *OpenshiftNonAPIConfig {
78+
func (c *MasterConfig) newOpenshiftNonAPIConfig(kubeAPIServerConfig apiserver.Config) (*OpenshiftNonAPIConfig, error) {
79+
var err error
7980
ret := &OpenshiftNonAPIConfig{
8081
GenericConfig: &apiserver.RecommendedConfig{
8182
Config: kubeAPIServerConfig,
8283
SharedInformerFactory: c.ClientGoKubeInformers,
8384
},
84-
ExtraConfig: NonAPIExtraConfig{
85-
EnableOAuth: c.Options.OAuthConfig != nil || c.Options.ExternalOAuthConfig != nil,
86-
},
8785
}
88-
if c.Options.OAuthConfig != nil {
89-
ret.ExtraConfig.MasterPublicURL = c.Options.OAuthConfig.MasterPublicURL
90-
}
91-
if c.Options.ExternalOAuthConfig != nil {
92-
ret.ExtraConfig.OAuthMetadataFile = c.Options.ExternalOAuthConfig.MetadataFile
86+
ret.ExtraConfig.OAuthMetadata, _, err = oauthutil.PrepOauthMetadata(c.Options)
87+
if err != nil {
88+
return nil, err
9389
}
9490

95-
return ret
91+
return ret, nil
9692
}
9793

9894
func (c *MasterConfig) withAPIExtensions(delegateAPIServer apiserver.DelegationTarget, kubeAPIServerConfig apiserver.Config) (apiserver.DelegationTarget, apiextensionsinformers.SharedInformerFactory, error) {
@@ -113,7 +109,10 @@ func (c *MasterConfig) withAPIExtensions(delegateAPIServer apiserver.DelegationT
113109
}
114110

115111
func (c *MasterConfig) withNonAPIRoutes(delegateAPIServer apiserver.DelegationTarget, kubeAPIServerConfig apiserver.Config) (apiserver.DelegationTarget, error) {
116-
openshiftNonAPIConfig := c.newOpenshiftNonAPIConfig(kubeAPIServerConfig)
112+
openshiftNonAPIConfig, err := c.newOpenshiftNonAPIConfig(kubeAPIServerConfig)
113+
if err != nil {
114+
return nil, err
115+
}
117116
openshiftNonAPIServer, err := openshiftNonAPIConfig.Complete().New(delegateAPIServer)
118117
if err != nil {
119118
return nil, err

pkg/cmd/server/origin/nonapiserver.go

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,15 @@
11
package origin
22

33
import (
4-
"encoding/json"
54
"net/http"
65

7-
"github.com/golang/glog"
8-
96
genericmux "k8s.io/apiserver/pkg/server/mux"
107

11-
oauthutil "github.com/openshift/origin/pkg/oauth/util"
128
genericapiserver "k8s.io/apiserver/pkg/server"
139
)
1410

1511
type NonAPIExtraConfig struct {
16-
MasterPublicURL string
17-
EnableOAuth bool
18-
OAuthMetadataFile string
12+
OAuthMetadata []byte
1913
}
2014

2115
type OpenshiftNonAPIConfig struct {
@@ -60,7 +54,7 @@ func (c completedOpenshiftNonAPIConfig) New(delegationTarget genericapiserver.De
6054

6155
// TODO move this up to the spot where we wire the oauth endpoint
6256
// Set up OAuth metadata only if we are configured to use OAuth
63-
if c.ExtraConfig.EnableOAuth {
57+
if len(c.ExtraConfig.OAuthMetadata) > 0 {
6458
initOAuthAuthorizationServerMetadataRoute(s.GenericAPIServer.Handler.NonGoRestfulMux, c.ExtraConfig)
6559
}
6660

@@ -78,27 +72,9 @@ const (
7872
// https://tools.ietf.org/id/draft-ietf-oauth-discovery-04.html#rfc.section.2
7973
// masterPublicURL should be internally and externally routable to allow all users to discover this information
8074
func initOAuthAuthorizationServerMetadataRoute(mux *genericmux.PathRecorderMux, ExtraConfig *NonAPIExtraConfig) {
81-
// Build OAuth metadata once
82-
var metadata []byte
83-
var err error
84-
85-
if len(ExtraConfig.OAuthMetadataFile) > 0 {
86-
metadata, err = oauthutil.LoadOAuthMetadataFile(ExtraConfig.OAuthMetadataFile)
87-
if err != nil {
88-
glog.Error(err)
89-
return
90-
}
91-
} else {
92-
metadata, err = json.MarshalIndent(oauthutil.GetOauthMetadata(ExtraConfig.MasterPublicURL), "", " ")
93-
if err != nil {
94-
glog.Errorf("Unable to initialize OAuth authorization server metadata route: %v", err)
95-
return
96-
}
97-
}
98-
9975
mux.UnlistedHandleFunc(oauthMetadataEndpoint, func(w http.ResponseWriter, req *http.Request) {
10076
w.Header().Set("Content-Type", "application/json")
10177
w.WriteHeader(http.StatusOK)
102-
w.Write(metadata)
78+
w.Write(ExtraConfig.OAuthMetadata)
10379
})
10480
}

pkg/oauth/util/discovery.go

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ import (
66
"io/ioutil"
77
"net/url"
88

9+
"github.com/golang/glog"
10+
911
"github.com/RangelReale/osin"
1012
"github.com/openshift/origin/pkg/authorization/authorizer/scope"
13+
configapi "github.com/openshift/origin/pkg/cmd/server/apis/config"
1114
"github.com/openshift/origin/pkg/oauth/apis/oauth/validation"
1215
"github.com/openshift/origin/pkg/oauthserver/osinserver"
1316
)
@@ -43,7 +46,7 @@ type OauthAuthorizationServerMetadata struct {
4346
CodeChallengeMethodsSupported []string `json:"code_challenge_methods_supported"`
4447
}
4548

46-
func GetOauthMetadata(masterPublicURL string) OauthAuthorizationServerMetadata {
49+
func getOauthMetadata(masterPublicURL string) OauthAuthorizationServerMetadata {
4750
config := osinserver.NewDefaultServerConfig()
4851
return OauthAuthorizationServerMetadata{
4952
Issuer: masterPublicURL,
@@ -71,28 +74,44 @@ func validateURL(urlString string) error {
7174
return nil
7275
}
7376

74-
func LoadOAuthMetadataFile(metadataFile string) ([]byte, error) {
77+
func LoadOAuthMetadataFile(metadataFile string) ([]byte, *OauthAuthorizationServerMetadata, error) {
7578
data, err := ioutil.ReadFile(metadataFile)
7679
if err != nil {
77-
return nil, fmt.Errorf("Unable to read External OAuth Metadata file: %v", err)
80+
return nil, nil, fmt.Errorf("Unable to read External OAuth Metadata file: %v", err)
7881
}
7982

80-
oauthMetadata := OauthAuthorizationServerMetadata{}
81-
if err := json.Unmarshal(data, &oauthMetadata); err != nil {
82-
return nil, fmt.Errorf("Unable to decode External OAuth Metadata file: %v", err)
83+
oauthMetadata := &OauthAuthorizationServerMetadata{}
84+
if err := json.Unmarshal(data, oauthMetadata); err != nil {
85+
return nil, nil, fmt.Errorf("Unable to decode External OAuth Metadata file: %v", err)
8386
}
8487

8588
if err := validateURL(oauthMetadata.Issuer); err != nil {
86-
return nil, fmt.Errorf("Error validating External OAuth Metadata Issuer field: %v", err)
89+
return nil, nil, fmt.Errorf("Error validating External OAuth Metadata Issuer field: %v", err)
8790
}
8891

8992
if err := validateURL(oauthMetadata.AuthorizationEndpoint); err != nil {
90-
return nil, fmt.Errorf("Error validating External OAuth Metadata AuthorizationEndpoint field: %v", err)
93+
return nil, nil, fmt.Errorf("Error validating External OAuth Metadata AuthorizationEndpoint field: %v", err)
9194
}
9295

9396
if err := validateURL(oauthMetadata.TokenEndpoint); err != nil {
94-
return nil, fmt.Errorf("Error validating External OAuth Metadata TokenEndpoint field: %v", err)
97+
return nil, nil, fmt.Errorf("Error validating External OAuth Metadata TokenEndpoint field: %v", err)
9598
}
9699

97-
return data, nil
100+
return data, oauthMetadata, nil
101+
}
102+
103+
func PrepOauthMetadata(config configapi.MasterConfig) ([]byte, *OauthAuthorizationServerMetadata, error) {
104+
if config.OAuthConfig != nil {
105+
metadataStruct := getOauthMetadata(config.OAuthConfig.MasterPublicURL)
106+
metadata, err := json.MarshalIndent(metadataStruct, "", " ")
107+
if err != nil {
108+
glog.Errorf("Unable to initialize OAuth authorization server metadata route: %v", err)
109+
return nil, nil, err
110+
}
111+
return metadata, &metadataStruct, nil
112+
}
113+
if config.ExternalOAuthConfig != nil {
114+
return LoadOAuthMetadataFile(config.ExternalOAuthConfig.MetadataFile)
115+
}
116+
return nil, nil, nil
98117
}

pkg/oauth/util/discovery_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
)
99

1010
func TestGetOauthMetadata(t *testing.T) {
11-
actual := GetOauthMetadata("https://localhost:8443")
11+
actual := getOauthMetadata("https://localhost:8443")
1212
expected := OauthAuthorizationServerMetadata{
1313
Issuer: "https://localhost:8443",
1414
AuthorizationEndpoint: "https://localhost:8443/oauth/authorize",

0 commit comments

Comments
 (0)