Skip to content

Commit 75fcfbe

Browse files
committed
chore: add storage provider abstraction
1 parent a5f0b09 commit 75fcfbe

37 files changed

+273
-250
lines changed

compose/compose.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"github.com/ory/fosite/token/jwt"
1111
)
1212

13-
type Factory func(config fosite.Configurator, storage interface{}, strategy interface{}) interface{}
13+
type Factory func(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{}
1414

1515
// Compose takes a config, a storage, a strategy and handlers to instantiate an OAuth2Provider:
1616
//
@@ -34,8 +34,8 @@ type Factory func(config fosite.Configurator, storage interface{}, strategy inte
3434
// )
3535
//
3636
// Compose makes use of interface{} types in order to be able to handle a all types of stores, strategies and handlers.
37-
func Compose(config *fosite.Config, storage interface{}, strategy interface{}, factories ...Factory) fosite.OAuth2Provider {
38-
f := fosite.NewOAuth2Provider(storage.(fosite.Storage), config)
37+
func Compose(config *fosite.Config, storage fosite.Storage, strategy interface{}, factories ...Factory) fosite.OAuth2Provider {
38+
f := fosite.NewOAuth2Provider(storage, config)
3939
for _, factory := range factories {
4040
res := factory(config, storage, strategy)
4141
if ah, ok := res.(fosite.AuthorizeEndpointHandler); ok {
@@ -62,7 +62,7 @@ func Compose(config *fosite.Config, storage interface{}, strategy interface{}, f
6262
}
6363

6464
// ComposeAllEnabled returns a fosite instance with all OAuth2 and OpenID Connect handlers enabled.
65-
func ComposeAllEnabled(config *fosite.Config, storage interface{}, key interface{}) fosite.OAuth2Provider {
65+
func ComposeAllEnabled(config *fosite.Config, storage fosite.Storage, key interface{}) fosite.OAuth2Provider {
6666
keyGetter := func(context.Context) (interface{}, error) {
6767
return key, nil
6868
}

compose/compose_oauth2.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,24 @@ import (
1111

1212
// OAuth2AuthorizeExplicitFactory creates an OAuth2 authorize code grant ("authorize explicit flow") handler and registers
1313
// an access token, refresh token and authorize code validator.
14-
func OAuth2AuthorizeExplicitFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
14+
func OAuth2AuthorizeExplicitFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
1515
return &oauth2.AuthorizeExplicitGrantHandler{
1616
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
1717
RefreshTokenStrategy: strategy.(oauth2.RefreshTokenStrategy),
1818
AuthorizeCodeStrategy: strategy.(oauth2.AuthorizeCodeStrategy),
19-
CoreStorage: storage.(oauth2.CoreStorage),
20-
TokenRevocationStorage: storage.(oauth2.TokenRevocationStorage),
19+
Storage: storage.(oauth2.CoreStorage),
20+
TokenRevocationStorage: storage.(oauth2.TokenRevocationStorageProvider),
2121
Config: config,
2222
}
2323
}
2424

2525
// OAuth2ClientCredentialsGrantFactory creates an OAuth2 client credentials grant handler and registers
2626
// an access token, refresh token and authorize code validator.
27-
func OAuth2ClientCredentialsGrantFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
27+
func OAuth2ClientCredentialsGrantFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
2828
return &oauth2.ClientCredentialsGrantHandler{
2929
HandleHelper: &oauth2.HandleHelper{
3030
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
31-
AccessTokenStorage: storage.(oauth2.AccessTokenStorage),
31+
Storage: storage.(oauth2.AccessTokenStorageProvider),
3232
Config: config,
3333
},
3434
Config: config,
@@ -37,7 +37,7 @@ func OAuth2ClientCredentialsGrantFactory(config fosite.Configurator, storage int
3737

3838
// OAuth2RefreshTokenGrantFactory creates an OAuth2 refresh grant handler and registers
3939
// an access token, refresh token and authorize code validator.nmj
40-
func OAuth2RefreshTokenGrantFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
40+
func OAuth2RefreshTokenGrantFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
4141
return &oauth2.RefreshTokenGrantHandler{
4242
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
4343
RefreshTokenStrategy: strategy.(oauth2.RefreshTokenStrategy),
@@ -48,7 +48,7 @@ func OAuth2RefreshTokenGrantFactory(config fosite.Configurator, storage interfac
4848

4949
// OAuth2AuthorizeImplicitFactory creates an OAuth2 implicit grant ("authorize implicit flow") handler and registers
5050
// an access token, refresh token and authorize code validator.
51-
func OAuth2AuthorizeImplicitFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
51+
func OAuth2AuthorizeImplicitFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
5252
return &oauth2.AuthorizeImplicitGrantTypeHandler{
5353
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
5454
AccessTokenStorage: storage.(oauth2.AccessTokenStorage),
@@ -62,12 +62,12 @@ func OAuth2AuthorizeImplicitFactory(config fosite.Configurator, storage interfac
6262
// Deprecated: This factory is deprecated as a means to communicate that the ROPC grant type is widely discouraged and
6363
// is at the time of this writing going to be omitted in the OAuth 2.1 spec. For more information on why this grant type
6464
// is discouraged see: https://www.scottbrady91.com/oauth/why-the-resource-owner-password-credentials-grant-type-is-not-authentication-nor-suitable-for-modern-applications
65-
func OAuth2ResourceOwnerPasswordCredentialsFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
65+
func OAuth2ResourceOwnerPasswordCredentialsFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
6666
return &oauth2.ResourceOwnerPasswordCredentialsGrantHandler{
6767
ResourceOwnerPasswordCredentialsGrantStorage: storage.(oauth2.ResourceOwnerPasswordCredentialsGrantStorage),
6868
HandleHelper: &oauth2.HandleHelper{
6969
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
70-
AccessTokenStorage: storage.(oauth2.AccessTokenStorage),
70+
Storage: storage.(oauth2.AccessTokenStorageProvider),
7171
Config: config,
7272
},
7373
RefreshTokenStrategy: strategy.(oauth2.RefreshTokenStrategy),
@@ -76,17 +76,17 @@ func OAuth2ResourceOwnerPasswordCredentialsFactory(config fosite.Configurator, s
7676
}
7777

7878
// OAuth2TokenRevocationFactory creates an OAuth2 token revocation handler.
79-
func OAuth2TokenRevocationFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
79+
func OAuth2TokenRevocationFactory(_ fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
8080
return &oauth2.TokenRevocationHandler{
81-
TokenRevocationStorage: storage.(oauth2.TokenRevocationStorage),
81+
TokenRevocationStorage: storage.(oauth2.TokenRevocationStorageProvider),
8282
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
8383
RefreshTokenStrategy: strategy.(oauth2.RefreshTokenStrategy),
8484
}
8585
}
8686

8787
// OAuth2TokenIntrospectionFactory creates an OAuth2 token introspection handler and registers
8888
// an access token and refresh token validator.
89-
func OAuth2TokenIntrospectionFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
89+
func OAuth2TokenIntrospectionFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
9090
return &oauth2.CoreValidator{
9191
CoreStrategy: strategy.(oauth2.CoreStrategy),
9292
CoreStorage: storage.(oauth2.CoreStorage),
@@ -101,7 +101,7 @@ func OAuth2TokenIntrospectionFactory(config fosite.Configurator, storage interfa
101101
//
102102
// Due to the stateless nature of this factory, THE BUILT-IN REVOCATION MECHANISMS WILL NOT WORK.
103103
// If you need revocation, you can validate JWTs statefully, using the other factories.
104-
func OAuth2StatelessJWTIntrospectionFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
104+
func OAuth2StatelessJWTIntrospectionFactory(config fosite.Configurator, _ fosite.Storage, strategy interface{}) interface{} {
105105
return &oauth2.StatelessJWTValidator{
106106
Signer: strategy.(jwt.Signer),
107107
Config: config,

compose/compose_openid.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import (
1414
// OpenIDConnectExplicitFactory creates an OpenID Connect explicit ("authorize code flow") grant handler.
1515
//
1616
// **Important note:** You must add this handler *after* you have added an OAuth2 authorize code handler!
17-
func OpenIDConnectExplicitFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
18-
return &openid.OpenIDConnectExplicitHandler{
19-
OpenIDConnectRequestStorage: storage.(openid.OpenIDConnectRequestStorage),
17+
func OpenIDConnectExplicitFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
18+
return &openid.ExplicitHandler{
19+
Storage: storage.(openid.RequestStorageProvider),
2020
IDTokenHandleHelper: &openid.IDTokenHandleHelper{
2121
IDTokenStrategy: strategy.(openid.OpenIDConnectTokenStrategy),
2222
},
@@ -28,7 +28,7 @@ func OpenIDConnectExplicitFactory(config fosite.Configurator, storage interface{
2828
// OpenIDConnectRefreshFactory creates a handler for refreshing openid connect tokens.
2929
//
3030
// **Important note:** You must add this handler *after* you have added an OAuth2 authorize code handler!
31-
func OpenIDConnectRefreshFactory(config fosite.Configurator, _ interface{}, strategy interface{}) interface{} {
31+
func OpenIDConnectRefreshFactory(config fosite.Configurator, _ fosite.Storage, strategy interface{}) interface{} {
3232
return &openid.OpenIDConnectRefreshHandler{
3333
IDTokenHandleHelper: &openid.IDTokenHandleHelper{
3434
IDTokenStrategy: strategy.(openid.OpenIDConnectTokenStrategy),
@@ -40,11 +40,11 @@ func OpenIDConnectRefreshFactory(config fosite.Configurator, _ interface{}, stra
4040
// OpenIDConnectImplicitFactory creates an OpenID Connect implicit ("implicit flow") grant handler.
4141
//
4242
// **Important note:** You must add this handler *after* you have added an OAuth2 authorize code handler!
43-
func OpenIDConnectImplicitFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
43+
func OpenIDConnectImplicitFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
4444
return &openid.OpenIDConnectImplicitHandler{
4545
AuthorizeImplicitGrantTypeHandler: &oauth2.AuthorizeImplicitGrantTypeHandler{
4646
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
47-
AccessTokenStorage: storage.(oauth2.AccessTokenStorage),
47+
AccessTokenStorage: storage.(oauth2.AccessTokenStorageProvider),
4848
Config: config,
4949
},
5050
Config: config,
@@ -58,35 +58,35 @@ func OpenIDConnectImplicitFactory(config fosite.Configurator, storage interface{
5858
// OpenIDConnectHybridFactory creates an OpenID Connect hybrid grant handler.
5959
//
6060
// **Important note:** You must add this handler *after* you have added an OAuth2 authorize code handler!
61-
func OpenIDConnectHybridFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
61+
func OpenIDConnectHybridFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
6262
return &openid.OpenIDConnectHybridHandler{
6363
AuthorizeExplicitGrantHandler: &oauth2.AuthorizeExplicitGrantHandler{
6464
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
6565
RefreshTokenStrategy: strategy.(oauth2.RefreshTokenStrategy),
6666
AuthorizeCodeStrategy: strategy.(oauth2.AuthorizeCodeStrategy),
67-
CoreStorage: storage.(oauth2.CoreStorage),
67+
Storage: storage.(oauth2.CoreStorage),
6868
Config: config,
6969
},
7070
Config: config,
7171
AuthorizeImplicitGrantTypeHandler: &oauth2.AuthorizeImplicitGrantTypeHandler{
7272
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
73-
AccessTokenStorage: storage.(oauth2.AccessTokenStorage),
73+
AccessTokenStorage: storage.(oauth2.AccessTokenStorageProvider),
7474
Config: config,
7575
},
7676
IDTokenHandleHelper: &openid.IDTokenHandleHelper{
7777
IDTokenStrategy: strategy.(openid.OpenIDConnectTokenStrategy),
7878
},
79-
OpenIDConnectRequestStorage: storage.(openid.OpenIDConnectRequestStorage),
79+
OpenIDConnectRequestStorage: storage.(openid.RequestStorageProvider),
8080
OpenIDConnectRequestValidator: openid.NewOpenIDConnectRequestValidator(strategy.(jwt.Signer), config),
8181
}
8282
}
8383

8484
// OpenIDConnectDeviceFactory creates an OpenID Connect device ("device code flow") grant handler.
8585
//
8686
// **Important note:** You must add this handler *after* you have added an OAuth2 device authorization handler!
87-
func OpenIDConnectDeviceFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
87+
func OpenIDConnectDeviceFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
8888
return &openid.OpenIDConnectDeviceHandler{
89-
OpenIDConnectRequestStorage: storage.(openid.OpenIDConnectRequestStorage),
89+
OpenIDConnectRequestStorage: storage.(openid.RequestStorageProvider),
9090
IDTokenHandleHelper: &openid.IDTokenHandleHelper{
9191
IDTokenStrategy: strategy.(openid.OpenIDConnectTokenStrategy),
9292
},

compose/compose_par.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import (
99
)
1010

1111
// PushedAuthorizeHandlerFactory creates the basic PAR handler
12-
func PushedAuthorizeHandlerFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
12+
func PushedAuthorizeHandlerFactory(config fosite.Configurator, storage fosite.Storage, _ interface{}) interface{} {
1313
return &par.PushedAuthorizeHandler{
14-
Storage: storage,
14+
Storage: storage.(par.StorageProvider),
1515
Config: config,
1616
}
1717
}

compose/compose_pkce.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import (
1010
)
1111

1212
// OAuth2PKCEFactory creates a PKCE handler.
13-
func OAuth2PKCEFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
13+
func OAuth2PKCEFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
1414
return &pkce.Handler{
1515
AuthorizeCodeStrategy: strategy.(oauth2.AuthorizeCodeStrategy),
16-
Storage: storage.(pkce.PKCERequestStorage),
16+
Storage: storage.(pkce.RequestStorageProvider),
1717
Config: config,
1818
}
1919
}

compose/compose_rfc7523.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import (
1111

1212
// RFC7523AssertionGrantFactory creates an OAuth2 Authorize JWT Grant (using JWTs as Authorization Grants) handler
1313
// and registers an access token, refresh token and authorize code validator.
14-
func RFC7523AssertionGrantFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
14+
func RFC7523AssertionGrantFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
1515
return &rfc7523.Handler{
1616
Storage: storage.(rfc7523.RFC7523KeyStorage),
1717
HandleHelper: &oauth2.HandleHelper{
1818
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
19-
AccessTokenStorage: storage.(oauth2.AccessTokenStorage),
19+
Storage: storage.(oauth2.AccessTokenStorageProvider),
2020
Config: config,
2121
},
2222
Config: config,

compose/compose_rfc8628.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,25 @@ import (
1313

1414
// RFC8628DeviceFactory creates an OAuth2 device code grant ("Device Authorization Grant") handler and registers
1515
// a user code, device code, access token and a refresh token validator.
16-
func RFC8628DeviceFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
16+
func RFC8628DeviceFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
1717
return &rfc8628.DeviceAuthHandler{
1818
Strategy: strategy.(rfc8628.RFC8628CodeStrategy),
19-
Storage: storage.(rfc8628.RFC8628CoreStorage),
19+
Storage: storage.(rfc8628.Storage),
2020
Config: config,
2121
}
2222
}
2323

2424
// RFC8628DeviceAuthorizationTokenFactory creates an OAuth2 device authorization grant ("Device Authorization Grant") handler and registers
2525
// an access token, refresh token and authorize code validator.
26-
func RFC8628DeviceAuthorizationTokenFactory(config fosite.Configurator, storage interface{}, strategy interface{}) interface{} {
26+
func RFC8628DeviceAuthorizationTokenFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
2727
return &rfc8628.DeviceCodeTokenEndpointHandler{
2828
DeviceRateLimitStrategy: strategy.(rfc8628.DeviceRateLimitStrategy),
2929
DeviceCodeStrategy: strategy.(rfc8628.DeviceCodeStrategy),
3030
UserCodeStrategy: strategy.(rfc8628.UserCodeStrategy),
3131
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
3232
RefreshTokenStrategy: strategy.(oauth2.RefreshTokenStrategy),
33-
CoreStorage: storage.(rfc8628.RFC8628CoreStorage),
34-
TokenRevocationStorage: storage.(oauth2.TokenRevocationStorage),
33+
CoreStorage: storage.(rfc8628.Storage),
34+
TokenRevocationStorage: storage.(oauth2.TokenRevocationStorageProvider),
3535
Config: config,
3636
}
3737
}

handler/oauth2/flow_authorize_code_auth.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ type AuthorizeExplicitGrantHandler struct {
2323
AccessTokenStrategy AccessTokenStrategy
2424
RefreshTokenStrategy RefreshTokenStrategy
2525
AuthorizeCodeStrategy AuthorizeCodeStrategy
26-
CoreStorage CoreStorage
27-
TokenRevocationStorage TokenRevocationStorage
26+
Storage CoreStorage
27+
TokenRevocationStorage TokenRevocationStorageProvider
2828
Config interface {
2929
fosite.AuthorizeCodeLifespanProvider
3030
fosite.AccessTokenLifespanProvider
@@ -83,7 +83,7 @@ func (c *AuthorizeExplicitGrantHandler) IssueAuthorizeCode(ctx context.Context,
8383
}
8484

8585
ar.GetSession().SetExpiresAt(fosite.AuthorizeCode, time.Now().UTC().Add(c.Config.GetAuthorizeCodeLifespan(ctx)))
86-
if err := c.CoreStorage.CreateAuthorizeCodeSession(ctx, signature, ar.Sanitize(c.GetSanitationWhiteList(ctx))); err != nil {
86+
if err := c.Storage.AuthorizeCodeStorage().CreateAuthorizeCodeSession(ctx, signature, ar.Sanitize(c.GetSanitationWhiteList(ctx))); err != nil {
8787
return errorsx.WithStack(fosite.ErrServerError.WithWrap(err).WithDebug(err.Error()))
8888
}
8989

handler/oauth2/flow_authorize_code_auth_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func TestAuthorizeCode_HandleAuthorizeEndpointRequest(t *testing.T) {
2929
t.Run("strategy="+k, func(t *testing.T) {
3030
store := storage.NewMemoryStore()
3131
handler := AuthorizeExplicitGrantHandler{
32-
CoreStorage: store,
32+
Storage: store,
3333
AuthorizeCodeStrategy: strategy,
3434
Config: &fosite.Config{
3535
AudienceMatchingStrategy: fosite.DefaultAudienceMatchingStrategy,
@@ -123,7 +123,7 @@ func TestAuthorizeCode_HandleAuthorizeEndpointRequest(t *testing.T) {
123123
},
124124
{
125125
handler: AuthorizeExplicitGrantHandler{
126-
CoreStorage: store,
126+
Storage: store,
127127
AuthorizeCodeStrategy: strategy,
128128
Config: &fosite.Config{
129129
ScopeStrategy: fosite.HierarchicScopeStrategy,

0 commit comments

Comments
 (0)