github.com/Axway/agent-sdk@v1.1.101/pkg/authz/oauth/providerregistry.go (about) 1 package oauth 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/Axway/agent-sdk/pkg/cache" 8 corecfg "github.com/Axway/agent-sdk/pkg/config" 9 "github.com/Axway/agent-sdk/pkg/util/log" 10 ) 11 12 const ( 13 issuerKeyPrefix = "issuer:" 14 tokenEpKeyPrefix = "tokenEp:" 15 mtlsTokenEpKeyPrefix = "mtlsTokenEp:" 16 authEpKeyPrefix = "authEp:" 17 metadataURLKeyPrefix = "metadataUrl:" 18 ) 19 20 // ProviderRegistry - interface for provider registry 21 type ProviderRegistry interface { 22 // RegisterProvider - registers the provider using the config 23 RegisterProvider(idp corecfg.IDPConfig, tlsCfg corecfg.TLSConfig, proxyURL string, clientTimeout time.Duration) error 24 // GetProviderByName - returns the provider from registry based on the name 25 GetProviderByName(name string) (Provider, error) 26 // GetProviderByIssuer - returns the provider from registry based on the IDP issuer 27 GetProviderByIssuer(issuer string) (Provider, error) 28 // GetProviderByTokenEndpoint - returns the provider from registry based on the IDP token endpoint 29 GetProviderByTokenEndpoint(tokenEndpoint string) (Provider, error) 30 // GetProviderByAuthorizationEndpoint - returns the provider from registry based on the IDP authorization endpoint 31 GetProviderByAuthorizationEndpoint(authEndpoint string) (Provider, error) 32 // GetProviderByMetadataURL - returns the provider from registry based on the IDP metadata URL 33 GetProviderByMetadataURL(metadataURL string) (Provider, error) 34 } 35 36 type providerRegistry struct { 37 logger log.FieldLogger 38 providerMap cache.Cache 39 } 40 41 // NewProviderRegistry - create a new provider registry 42 func NewProviderRegistry() ProviderRegistry { 43 logger := log.NewFieldLogger(). 44 WithComponent("providerRegistry"). 45 WithPackage("sdk.agent.authz.oauth") 46 return &providerRegistry{ 47 logger: logger, 48 providerMap: cache.New(), 49 } 50 } 51 52 // RegisterProvider - registers the provider using the config 53 func (r *providerRegistry) RegisterProvider(idp corecfg.IDPConfig, tlsCfg corecfg.TLSConfig, proxyURL string, clientTimeout time.Duration) error { 54 p, err := NewProvider(idp, tlsCfg, proxyURL, clientTimeout) 55 if err != nil { 56 return err 57 } 58 59 name := p.GetName() 60 issuer := p.GetIssuer() 61 tokenEndpoint := p.GetTokenEndpoint() 62 mtlsTokenEndpoint := p.GetMTLSTokenEndpoint() 63 authEndPoint := p.GetAuthorizationEndpoint() 64 65 r.logger. 66 WithField("name", name). 67 WithField("issuer", issuer). 68 WithField("token-endpoint", tokenEndpoint). 69 WithField("authorization-endpoint", authEndPoint). 70 Debug("registered IDP provider") 71 72 r.providerMap.Set(name, p) 73 r.providerMap.SetSecondaryKey(name, issuerKeyPrefix+issuer) 74 r.providerMap.SetSecondaryKey(name, tokenEpKeyPrefix+tokenEndpoint) 75 r.providerMap.SetSecondaryKey(name, metadataURLKeyPrefix+idp.GetMetadataURL()) 76 if mtlsTokenEndpoint != "" { 77 r.providerMap.SetSecondaryKey(name, mtlsTokenEpKeyPrefix+mtlsTokenEndpoint) 78 } 79 r.providerMap.SetSecondaryKey(name, authEpKeyPrefix+authEndPoint) 80 81 return nil 82 } 83 84 // GetProviderByName - returns the provider from registry based on the name 85 func (r *providerRegistry) GetProviderByName(name string) (Provider, error) { 86 p, err := r.providerMap.Get(name) 87 if err != nil { 88 return nil, err 89 } 90 91 prov, ok := p.(Provider) 92 if !ok { 93 return nil, fmt.Errorf("unexpected provider entry for %s", name) 94 } 95 return prov, nil 96 } 97 98 // GetProviderByTokenEndpoint - returns the provider from registry based on the IDP token endpoint 99 func (r *providerRegistry) GetProviderByIssuer(issuer string) (Provider, error) { 100 return r.getProviderBySecondaryKey(issuerKeyPrefix + issuer) 101 } 102 103 // GetProviderByTokenEndpoint - returns the provider from registry based on the IDP token endpoint 104 func (r *providerRegistry) GetProviderByTokenEndpoint(tokenEndpoint string) (Provider, error) { 105 p, err := r.getProviderBySecondaryKey(mtlsTokenEpKeyPrefix + tokenEndpoint) 106 if err != nil { 107 p, err = r.getProviderBySecondaryKey(tokenEpKeyPrefix + tokenEndpoint) 108 } 109 return p, err 110 } 111 112 // GetProviderByAuthorizationEndpoint - returns the provider from registry based on the IDP authorization endpoint 113 func (r *providerRegistry) GetProviderByAuthorizationEndpoint(authEndpoint string) (Provider, error) { 114 return r.getProviderBySecondaryKey(authEpKeyPrefix + authEndpoint) 115 } 116 117 // GetProviderByMetadataURL - returns the provider from registry based on the IDP metadata URL 118 func (r *providerRegistry) GetProviderByMetadataURL(metadataURL string) (Provider, error) { 119 return r.getProviderBySecondaryKey(metadataURLKeyPrefix + metadataURL) 120 } 121 122 func (r *providerRegistry) getProviderBySecondaryKey(key string) (Provider, error) { 123 p, err := r.providerMap.GetBySecondaryKey(key) 124 if err != nil { 125 return nil, err 126 } 127 128 prov, ok := p.(Provider) 129 if !ok { 130 return nil, fmt.Errorf("unexpected provider entry for %s", key) 131 } 132 return prov, nil 133 }