Skip to content

Commit dfdec8e

Browse files
committed
chore: continue interface refactor - wip
1 parent 4ef4b56 commit dfdec8e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+516
-364
lines changed

compose/compose_oauth2.go

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,44 +13,53 @@ import (
1313
// an access token, refresh token and authorize code validator.
1414
func OAuth2AuthorizeExplicitFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
1515
return &oauth2.AuthorizeExplicitGrantHandler{
16-
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
17-
RefreshTokenStrategy: strategy.(oauth2.RefreshTokenStrategy),
18-
AuthorizeCodeStrategy: strategy.(oauth2.AuthorizeCodeStrategy),
19-
Storage: storage.(oauth2.CoreStorage),
20-
TokenRevocationStorage: storage.(oauth2.TokenRevocationStorageProvider),
21-
Config: config,
16+
Strategy: strategy.(interface {
17+
oauth2.AccessTokenStrategyProvider
18+
oauth2.RefreshTokenStrategyProvider
19+
oauth2.AuthorizeCodeStrategyProvider
20+
}),
21+
Storage: storage.(interface {
22+
oauth2.AuthorizeCodeStorageProvider
23+
oauth2.AccessTokenStorageProvider
24+
oauth2.RefreshTokenStorageProvider
25+
oauth2.TokenRevocationStorageProvider
26+
}),
27+
Config: config,
2228
}
2329
}
2430

2531
// OAuth2ClientCredentialsGrantFactory creates an OAuth2 client credentials grant handler and registers
2632
// an access token, refresh token and authorize code validator.
2733
func OAuth2ClientCredentialsGrantFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
2834
return &oauth2.ClientCredentialsGrantHandler{
29-
HandleHelper: &oauth2.HandleHelper{
30-
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
31-
Storage: storage.(oauth2.AccessTokenStorageProvider),
32-
Config: config,
33-
},
34-
Config: config,
35+
Strategy: strategy.(oauth2.AccessTokenStrategyProvider),
36+
Storage: storage.(oauth2.AccessTokenStorageProvider),
37+
Config: config,
3538
}
3639
}
3740

3841
// OAuth2RefreshTokenGrantFactory creates an OAuth2 refresh grant handler and registers
3942
// an access token, refresh token and authorize code validator.nmj
4043
func OAuth2RefreshTokenGrantFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
4144
return &oauth2.RefreshTokenGrantHandler{
42-
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
43-
RefreshTokenStrategy: strategy.(oauth2.RefreshTokenStrategy),
44-
TokenRevocationStorage: storage.(oauth2.TokenRevocationStorageProvider),
45-
Config: config,
45+
Strategy: strategy.(interface {
46+
oauth2.AccessTokenStrategyProvider
47+
oauth2.RefreshTokenStrategyProvider
48+
}),
49+
Storage: storage.(interface {
50+
oauth2.AccessTokenStorageProvider
51+
oauth2.RefreshTokenStorageProvider
52+
oauth2.TokenRevocationStorageProvider
53+
}),
54+
Config: config,
4655
}
4756
}
4857

4958
// OAuth2AuthorizeImplicitFactory creates an OAuth2 implicit grant ("authorize implicit flow") handler and registers
5059
// an access token, refresh token and authorize code validator.
5160
func OAuth2AuthorizeImplicitFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
52-
return &oauth2.AuthorizeImplicitGrantTypeHandler{
53-
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
61+
return &oauth2.AuthorizeImplicitGrantHandler{
62+
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategyProvider),
5463
AccessTokenStorage: storage.(oauth2.AccessTokenStorageProvider),
5564
Config: config,
5665
}

compose/compose_openid.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func OpenIDConnectRefreshFactory(config fosite.Configurator, _ fosite.Storage, s
4242
// **Important note:** You must add this handler *after* you have added an OAuth2 authorize code handler!
4343
func OpenIDConnectImplicitFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
4444
return &openid.OpenIDConnectImplicitHandler{
45-
AuthorizeImplicitGrantTypeHandler: &oauth2.AuthorizeImplicitGrantTypeHandler{
45+
AuthorizeImplicitGrantTypeHandler: &oauth2.AuthorizeImplicitGrantHandler{
4646
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
4747
AccessTokenStorage: storage.(oauth2.AccessTokenStorageProvider),
4848
Config: config,
@@ -68,7 +68,7 @@ func OpenIDConnectHybridFactory(config fosite.Configurator, storage fosite.Stora
6868
Config: config,
6969
},
7070
Config: config,
71-
AuthorizeImplicitGrantTypeHandler: &oauth2.AuthorizeImplicitGrantTypeHandler{
71+
AuthorizeImplicitGrantHandler: &oauth2.AuthorizeImplicitGrantHandler{
7272
AccessTokenStrategy: strategy.(oauth2.AccessTokenStrategy),
7373
AccessTokenStorage: storage.(oauth2.AccessTokenStorageProvider),
7474
Config: config,

compose/compose_pkce.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import (
1212
// OAuth2PKCEFactory creates a PKCE handler.
1313
func OAuth2PKCEFactory(config fosite.Configurator, storage fosite.Storage, strategy interface{}) interface{} {
1414
return &pkce.Handler{
15-
AuthorizeCodeStrategy: strategy.(oauth2.AuthorizeCodeStrategy),
16-
Storage: storage.(pkce.PKCERequestStorageProvider),
17-
Config: config,
15+
Strategy: strategy.(oauth2.AuthorizeCodeStrategy),
16+
Storage: storage.(pkce.PKCERequestStorageProvider),
17+
Config: config,
1818
}
1919
}

compose/compose_strategy.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,16 @@ import (
1515
)
1616

1717
type CommonStrategy struct {
18-
oauth2.CoreStrategy
19-
rfc8628.RFC8628CodeStrategy
18+
oauth2.AuthorizeCodeStrategyProvider
19+
oauth2.AccessTokenStrategyProvider
20+
oauth2.RefreshTokenStrategyProvider
21+
2022
openid.OpenIDConnectTokenStrategy
23+
24+
rfc8628.DeviceRateLimitStrategyProvider
25+
rfc8628.DeviceCodeStrategyProvider
26+
rfc8628.UserCodeStrategyProvider
27+
2128
jwt.Signer
2229
}
2330

@@ -38,9 +45,9 @@ func NewOAuth2HMACStrategy(config HMACSHAStrategyConfigurator) *oauth2.HMACSHASt
3845

3946
func NewOAuth2JWTStrategy(keyGetter func(context.Context) (interface{}, error), strategy oauth2.CoreStrategy, config fosite.Configurator) *oauth2.DefaultJWTStrategy {
4047
return &oauth2.DefaultJWTStrategy{
41-
Signer: &jwt.DefaultSigner{GetPrivateKey: keyGetter},
42-
HMACSHAStrategy: strategy,
43-
Config: config,
48+
Signer: &jwt.DefaultSigner{GetPrivateKey: keyGetter},
49+
Strategy: strategy,
50+
Config: config,
4451
}
4552
}
4653

handler/oauth2/flow_authorize_code_auth.go

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,30 @@ import (
99
"strings"
1010
"time"
1111

12-
"github.com/ory/x/errorsx"
13-
1412
"github.com/ory/fosite"
13+
"github.com/ory/x/errorsx"
1514
)
1615

17-
var _ fosite.AuthorizeEndpointHandler = (*AuthorizeExplicitGrantHandler)(nil)
18-
var _ fosite.TokenEndpointHandler = (*AuthorizeExplicitGrantHandler)(nil)
16+
var (
17+
_ fosite.AuthorizeEndpointHandler = (*AuthorizeExplicitGrantHandler)(nil)
18+
_ fosite.TokenEndpointHandler = (*AuthorizeExplicitGrantHandler)(nil)
19+
)
1920

2021
// AuthorizeExplicitGrantHandler is a response handler for the Authorize Code grant using the explicit grant type
2122
// as defined in https://tools.ietf.org/html/rfc6749#section-4.1
2223
type AuthorizeExplicitGrantHandler struct {
23-
AccessTokenStrategy AccessTokenStrategy
24-
RefreshTokenStrategy RefreshTokenStrategy
25-
AuthorizeCodeStrategy AuthorizeCodeStrategy
26-
Storage CoreStorage
27-
TokenRevocationStorage TokenRevocationStorageProvider
28-
Config interface {
24+
Storage interface {
25+
AuthorizeCodeStorageProvider
26+
AccessTokenStorageProvider
27+
RefreshTokenStorageProvider
28+
TokenRevocationStorageProvider
29+
}
30+
Strategy interface {
31+
AuthorizeCodeStrategyProvider
32+
AccessTokenStrategyProvider
33+
RefreshTokenStrategyProvider
34+
}
35+
Config interface {
2936
fosite.AuthorizeCodeLifespanProvider
3037
fosite.AccessTokenLifespanProvider
3138
fosite.RefreshTokenLifespanProvider
@@ -77,7 +84,7 @@ func (c *AuthorizeExplicitGrantHandler) HandleAuthorizeEndpointRequest(ctx conte
7784
}
7885

7986
func (c *AuthorizeExplicitGrantHandler) IssueAuthorizeCode(ctx context.Context, ar fosite.AuthorizeRequester, resp fosite.AuthorizeResponder) error {
80-
code, signature, err := c.AuthorizeCodeStrategy.GenerateAuthorizeCode(ctx, ar)
87+
code, signature, err := c.Strategy.AuthorizeCodeStrategy().GenerateAuthorizeCode(ctx, ar)
8188
if err != nil {
8289
return errorsx.WithStack(fosite.ErrServerError.WithWrap(err).WithDebug(err.Error()))
8390
}

handler/oauth2/flow_authorize_code_token.go

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@ import (
77
"context"
88
"time"
99

10+
"github.com/ory/fosite"
1011
"github.com/ory/x/errorsx"
1112

1213
"github.com/pkg/errors"
13-
14-
"github.com/ory/fosite"
1514
)
1615

1716
// HandleTokenEndpointRequest implements
@@ -26,7 +25,7 @@ func (c *AuthorizeExplicitGrantHandler) HandleTokenEndpointRequest(ctx context.C
2625
}
2726

2827
code := request.GetRequestForm().Get("code")
29-
signature := c.AuthorizeCodeStrategy.AuthorizeCodeSignature(ctx, code)
28+
signature := c.Strategy.AuthorizeCodeStrategy().AuthorizeCodeSignature(ctx, code)
3029
authorizeRequest, err := c.Storage.AuthorizeCodeStorage().GetAuthorizeCodeSession(ctx, signature, request.GetSession())
3130
if errors.Is(err, fosite.ErrInvalidatedAuthorizeCode) {
3231
if authorizeRequest == nil {
@@ -39,11 +38,11 @@ func (c *AuthorizeExplicitGrantHandler) HandleTokenEndpointRequest(ctx context.C
3938
reqID := authorizeRequest.GetID()
4039
hint := "The authorization code has already been used."
4140
debug := ""
42-
if revErr := c.TokenRevocationStorage.TokenRevocationStorage().RevokeAccessToken(ctx, reqID); revErr != nil {
41+
if revErr := c.Storage.TokenRevocationStorage().RevokeAccessToken(ctx, reqID); revErr != nil {
4342
hint += " Additionally, an error occurred during processing the access token revocation."
4443
debug += "Revocation of access_token lead to error " + revErr.Error() + "."
4544
}
46-
if revErr := c.TokenRevocationStorage.TokenRevocationStorage().RevokeRefreshToken(ctx, reqID); revErr != nil {
45+
if revErr := c.Storage.TokenRevocationStorage().RevokeRefreshToken(ctx, reqID); revErr != nil {
4746
hint += " Additionally, an error occurred during processing the refresh token revocation."
4847
debug += "Revocation of refresh_token lead to error " + revErr.Error() + "."
4948
}
@@ -56,7 +55,7 @@ func (c *AuthorizeExplicitGrantHandler) HandleTokenEndpointRequest(ctx context.C
5655

5756
// The authorization server MUST verify that the authorization code is valid
5857
// This needs to happen after store retrieval for the session to be hydrated properly
59-
if err := c.AuthorizeCodeStrategy.ValidateAuthorizeCode(ctx, request, code); err != nil {
58+
if err := c.Strategy.AuthorizeCodeStrategy().ValidateAuthorizeCode(ctx, request, code); err != nil {
6059
return errorsx.WithStack(fosite.ErrInvalidGrant.WithWrap(err).WithDebug(err.Error()))
6160
}
6261

@@ -120,11 +119,11 @@ func (c *AuthorizeExplicitGrantHandler) PopulateTokenEndpointResponse(ctx contex
120119
}
121120

122121
code := requester.GetRequestForm().Get("code")
123-
signature := c.AuthorizeCodeStrategy.AuthorizeCodeSignature(ctx, code)
122+
signature := c.Strategy.AuthorizeCodeStrategy().AuthorizeCodeSignature(ctx, code)
124123
authorizeRequest, err := c.Storage.AuthorizeCodeStorage().GetAuthorizeCodeSession(ctx, signature, requester.GetSession())
125124
if err != nil {
126125
return errorsx.WithStack(fosite.ErrServerError.WithWrap(err).WithDebug(err.Error()))
127-
} else if err := c.AuthorizeCodeStrategy.ValidateAuthorizeCode(ctx, requester, code); err != nil {
126+
} else if err := c.Strategy.AuthorizeCodeStrategy().ValidateAuthorizeCode(ctx, requester, code); err != nil {
128127
// This needs to happen after store retrieval for the session to be hydrated properly
129128
return errorsx.WithStack(fosite.ErrInvalidRequest.WithWrap(err).WithDebug(err.Error()))
130129
}
@@ -137,14 +136,14 @@ func (c *AuthorizeExplicitGrantHandler) PopulateTokenEndpointResponse(ctx contex
137136
requester.GrantAudience(audience)
138137
}
139138

140-
access, accessSignature, err := c.AccessTokenStrategy.GenerateAccessToken(ctx, requester)
139+
access, accessSignature, err := c.Strategy.AccessTokenStrategy().GenerateAccessToken(ctx, requester)
141140
if err != nil {
142141
return errorsx.WithStack(fosite.ErrServerError.WithWrap(err).WithDebug(err.Error()))
143142
}
144143

145144
var refresh, refreshSignature string
146145
if canIssueRefreshToken(ctx, c, authorizeRequest) {
147-
refresh, refreshSignature, err = c.RefreshTokenStrategy.GenerateRefreshToken(ctx, requester)
146+
refresh, refreshSignature, err = c.Strategy.RefreshTokenStrategy().GenerateRefreshToken(ctx, requester)
148147
if err != nil {
149148
return errorsx.WithStack(fosite.ErrServerError.WithWrap(err).WithDebug(err.Error()))
150149
}

handler/oauth2/flow_authorize_implicit.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,21 @@ import (
1414
"github.com/ory/fosite"
1515
)
1616

17-
var _ fosite.AuthorizeEndpointHandler = (*AuthorizeImplicitGrantTypeHandler)(nil)
17+
var _ fosite.AuthorizeEndpointHandler = (*AuthorizeImplicitGrantHandler)(nil)
1818

19-
// AuthorizeImplicitGrantTypeHandler is a response handler for the Authorize Code grant using the implicit grant type
19+
// AuthorizeImplicitGrantHandler is a response handler for the Authorize Code grant using the implicit grant type
2020
// as defined in https://tools.ietf.org/html/rfc6749#section-4.2
21-
type AuthorizeImplicitGrantTypeHandler struct {
22-
AccessTokenStrategy AccessTokenStrategy
23-
// AccessTokenStorage is used to persist session data across requests.
24-
AccessTokenStorage AccessTokenStorageProvider
25-
26-
Config interface {
21+
type AuthorizeImplicitGrantHandler struct {
22+
AccessTokenStrategy AccessTokenStrategyProvider
23+
AccessTokenStorage AccessTokenStorageProvider
24+
Config interface {
2725
fosite.AccessTokenLifespanProvider
2826
fosite.ScopeStrategyProvider
2927
fosite.AudienceStrategyProvider
3028
}
3129
}
3230

33-
func (c *AuthorizeImplicitGrantTypeHandler) HandleAuthorizeEndpointRequest(ctx context.Context, ar fosite.AuthorizeRequester, resp fosite.AuthorizeResponder) error {
31+
func (c *AuthorizeImplicitGrantHandler) HandleAuthorizeEndpointRequest(ctx context.Context, ar fosite.AuthorizeRequester, resp fosite.AuthorizeResponder) error {
3432
// This let's us define multiple response types, for example open id connect's id_token
3533
if !ar.GetResponseTypes().ExactOne("token") {
3634
return nil
@@ -64,22 +62,23 @@ func (c *AuthorizeImplicitGrantTypeHandler) HandleAuthorizeEndpointRequest(ctx c
6462
return c.IssueImplicitAccessToken(ctx, ar, resp)
6563
}
6664

67-
func (c *AuthorizeImplicitGrantTypeHandler) IssueImplicitAccessToken(ctx context.Context, ar fosite.AuthorizeRequester, resp fosite.AuthorizeResponder) error {
65+
func (c *AuthorizeImplicitGrantHandler) IssueImplicitAccessToken(ctx context.Context, ar fosite.AuthorizeRequester, resp fosite.AuthorizeResponder) error {
6866
// Only override expiry if none is set.
6967
atLifespan := fosite.GetEffectiveLifespan(ar.GetClient(), fosite.GrantTypeImplicit, fosite.AccessToken, c.Config.GetAccessTokenLifespan(ctx))
7068
if ar.GetSession().GetExpiresAt(fosite.AccessToken).IsZero() {
7169
ar.GetSession().SetExpiresAt(fosite.AccessToken, time.Now().UTC().Add(atLifespan).Round(time.Second))
7270
}
7371

74-
// Generate the code
75-
token, signature, err := c.AccessTokenStrategy.GenerateAccessToken(ctx, ar)
72+
// Generate the access token
73+
token, signature, err := c.AccessTokenStrategy.AccessTokenStrategy().GenerateAccessToken(ctx, ar)
7674
if err != nil {
7775
return errorsx.WithStack(fosite.ErrServerError.WithWrap(err).WithDebug(err.Error()))
7876
}
7977

8078
if err := c.AccessTokenStorage.AccessTokenStorage().CreateAccessTokenSession(ctx, signature, ar.Sanitize([]string{})); err != nil {
8179
return errorsx.WithStack(fosite.ErrServerError.WithWrap(err).WithDebug(err.Error()))
8280
}
81+
8382
resp.AddParameter("access_token", token)
8483
resp.AddParameter("expires_in", strconv.FormatInt(int64(getExpiresIn(ar, fosite.AccessToken, atLifespan, time.Now().UTC())/time.Second), 10))
8584
resp.AddParameter("token_type", "bearer")

handler/oauth2/flow_authorize_implicit_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,15 @@ func TestAuthorizeImplicit_EndpointHandler(t *testing.T) {
118118
}
119119
}
120120

121-
func makeAuthorizeImplicitGrantTypeHandler(ctrl *gomock.Controller) (oauth2.AuthorizeImplicitGrantTypeHandler,
121+
func makeAuthorizeImplicitGrantTypeHandler(ctrl *gomock.Controller) (oauth2.AuthorizeImplicitGrantHandler,
122122
*internal.MockAccessTokenStorage, *internal.MockAccessTokenStorageProvider, *internal.MockAccessTokenStrategy, *internal.MockAuthorizeResponder,
123123
) {
124124
store := internal.NewMockAccessTokenStorage(ctrl)
125125
provider := internal.NewMockAccessTokenStorageProvider(ctrl)
126126
chgen := internal.NewMockAccessTokenStrategy(ctrl)
127127
aresp := internal.NewMockAuthorizeResponder(ctrl)
128128

129-
h := oauth2.AuthorizeImplicitGrantTypeHandler{
129+
h := oauth2.AuthorizeImplicitGrantHandler{
130130
AccessTokenStorage: provider,
131131
AccessTokenStrategy: chgen,
132132
Config: &fosite.Config{

handler/oauth2/flow_client_credentials.go

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,20 @@ import (
77
"context"
88
"time"
99

10-
"github.com/ory/x/errorsx"
11-
1210
"github.com/ory/fosite"
11+
"github.com/ory/x/errorsx"
1312
)
1413

1514
var _ fosite.TokenEndpointHandler = (*ClientCredentialsGrantHandler)(nil)
1615

1716
type ClientCredentialsGrantHandler struct {
18-
*HandleHelper
19-
Config interface {
17+
Storage AccessTokenStorageProvider
18+
Strategy AccessTokenStrategyProvider
19+
Config interface {
2020
fosite.ScopeStrategyProvider
2121
fosite.AudienceStrategyProvider
2222
fosite.AccessTokenLifespanProvider
23+
fosite.RefreshTokenLifespanProvider
2324
}
2425
}
2526

@@ -68,6 +69,26 @@ func (c *ClientCredentialsGrantHandler) PopulateTokenEndpointResponse(ctx contex
6869
return err
6970
}
7071

72+
func (c *ClientCredentialsGrantHandler) IssueAccessToken(ctx context.Context, atLifespan time.Duration, requester fosite.AccessRequester, responder fosite.AccessResponder) (signature string, err error) {
73+
token, signature, err := c.Strategy.AccessTokenStrategy().GenerateAccessToken(ctx, requester)
74+
if err != nil {
75+
return "", err
76+
} else if err := c.Storage.AccessTokenStorage().CreateAccessTokenSession(ctx, signature, requester.Sanitize([]string{})); err != nil {
77+
return "", err
78+
}
79+
80+
if !requester.GetSession().GetExpiresAt(fosite.AccessToken).IsZero() {
81+
atLifespan = time.Duration(requester.GetSession().GetExpiresAt(fosite.AccessToken).UnixNano() - time.Now().UTC().UnixNano())
82+
}
83+
84+
responder.SetAccessToken(token)
85+
responder.SetTokenType("bearer")
86+
responder.SetExpiresIn(atLifespan)
87+
responder.SetScopes(requester.GetGrantedScopes())
88+
89+
return signature, nil
90+
}
91+
7192
func (c *ClientCredentialsGrantHandler) CanSkipClientAuth(ctx context.Context, requester fosite.AccessRequester) bool {
7293
return false
7394
}

handler/oauth2/flow_client_credentials_storage.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33

44
package oauth2
55

6-
type ClientCredentialsGrantStorage interface {
7-
AccessTokenStorage
8-
}
6+
// type ClientCredentialsGrantStorage interface {
7+
// AccessTokenStorage
8+
// }

0 commit comments

Comments
 (0)