Skip to content

Commit ef8f175

Browse files
authored
oauth2/introspector: remove auth code, refresh scopes (#187)
Removes authorize code introspection in the HMAC-based strategy and now checks scopes of refresh tokens as well.
1 parent 71451f0 commit ef8f175

File tree

3 files changed

+35
-47
lines changed

3 files changed

+35
-47
lines changed

HISTORY.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ bumps (`0.1.0` -> `0.2.0`).
1919

2020
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
2121

22+
## 0.10.0
23+
24+
It is no longer possible to introspect authorize codes, and passing scopes to the introspector now also checks
25+
refresh token scopes.
26+
2227
## 0.9.0
2328

2429
This patch adds the ability to pass a custom hasher to `compose.Compose`, which is a breaking change. You can pass nil for the fosite default hasher:

handler/oauth2/introspector.go

Lines changed: 30 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,34 +16,37 @@ type CoreValidator struct {
1616
func (c *CoreValidator) IntrospectToken(ctx context.Context, token string, tokenType fosite.TokenType, accessRequest fosite.AccessRequester, scopes []string) (err error) {
1717
switch tokenType {
1818
case fosite.RefreshToken:
19-
if err = c.introspectRefreshToken(ctx, token, accessRequest); err == nil {
20-
return err
21-
} else if err = c.introspectAuthorizeCode(ctx, token, accessRequest); err == nil {
22-
return err
19+
if err = c.introspectRefreshToken(ctx, token, accessRequest, scopes); err == nil {
20+
return nil
2321
} else if err = c.introspectAccessToken(ctx, token, accessRequest, scopes); err == nil {
24-
return err
25-
}
26-
return err
27-
case fosite.AuthorizeCode:
28-
if err = c.introspectAuthorizeCode(ctx, token, accessRequest); err == nil {
29-
return err
30-
} else if err := c.introspectAccessToken(ctx, token, accessRequest, scopes); err == nil {
31-
return err
32-
} else if err := c.introspectRefreshToken(ctx, token, accessRequest); err == nil {
33-
return err
22+
return nil
3423
}
3524
return err
3625
}
26+
3727
if err = c.introspectAccessToken(ctx, token, accessRequest, scopes); err == nil {
38-
return err
39-
} else if err := c.introspectRefreshToken(ctx, token, accessRequest); err == nil {
40-
return err
41-
} else if err := c.introspectAuthorizeCode(ctx, token, accessRequest); err == nil {
42-
return err
28+
return nil
29+
} else if err := c.introspectRefreshToken(ctx, token, accessRequest, scopes); err == nil {
30+
return nil
4331
}
32+
4433
return err
4534
}
4635

36+
func matchScopes(ss fosite.ScopeStrategy, granted, scopes []string) error {
37+
for _, scope := range scopes {
38+
if scope == "" {
39+
continue
40+
}
41+
42+
if !ss(granted, scope) {
43+
return errors.Wrapf(fosite.ErrInvalidScope, "Scope %s was not granted", scope)
44+
}
45+
}
46+
47+
return nil
48+
}
49+
4750
func (c *CoreValidator) introspectAccessToken(ctx context.Context, token string, accessRequest fosite.AccessRequester, scopes []string) error {
4851
sig := c.CoreStrategy.AccessTokenSignature(token)
4952
or, err := c.CoreStorage.GetAccessTokenSession(ctx, sig, accessRequest.GetSession())
@@ -53,42 +56,28 @@ func (c *CoreValidator) introspectAccessToken(ctx context.Context, token string,
5356
return err
5457
}
5558

56-
for _, scope := range scopes {
57-
if scope == "" {
58-
continue
59-
}
60-
61-
if !c.ScopeStrategy(or.GetGrantedScopes(), scope) {
62-
return errors.WithStack(fosite.ErrInvalidScope)
63-
}
59+
if err := matchScopes(c.ScopeStrategy, or.GetGrantedScopes(), scopes); err != nil {
60+
return err
6461
}
6562

6663
accessRequest.Merge(or)
6764
return nil
6865
}
6966

70-
func (c *CoreValidator) introspectRefreshToken(ctx context.Context, token string, accessRequest fosite.AccessRequester) error {
67+
func (c *CoreValidator) introspectRefreshToken(ctx context.Context, token string, accessRequest fosite.AccessRequester, scopes []string) error {
7168
sig := c.CoreStrategy.RefreshTokenSignature(token)
72-
if or, err := c.CoreStorage.GetRefreshTokenSession(ctx, sig, accessRequest.GetSession()); err != nil {
69+
or, err := c.CoreStorage.GetRefreshTokenSession(ctx, sig, accessRequest.GetSession())
70+
71+
if err != nil {
7372
return errors.Wrap(fosite.ErrRequestUnauthorized, err.Error())
7473
} else if err := c.CoreStrategy.ValidateRefreshToken(ctx, or, token); err != nil {
7574
return err
76-
} else {
77-
accessRequest.Merge(or)
7875
}
7976

80-
return nil
81-
}
82-
83-
func (c *CoreValidator) introspectAuthorizeCode(ctx context.Context, token string, accessRequest fosite.AccessRequester) error {
84-
sig := c.CoreStrategy.AuthorizeCodeSignature(token)
85-
if or, err := c.CoreStorage.GetAuthorizeCodeSession(ctx, sig, accessRequest.GetSession()); err != nil {
86-
return errors.Wrap(err, fosite.ErrRequestUnauthorized.Error())
87-
} else if err := c.CoreStrategy.ValidateAuthorizeCode(ctx, or, token); err != nil {
77+
if err := matchScopes(c.ScopeStrategy, or.GetGrantedScopes(), scopes); err != nil {
8878
return err
89-
} else {
90-
accessRequest.Merge(or)
9179
}
9280

81+
accessRequest.Merge(or)
9382
return nil
9483
}

handler/oauth2/introspector_test.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ func TestIntrospectToken(t *testing.T) {
3737
store.EXPECT().GetAccessTokenSession(nil, "", nil).Return(nil, errors.New(""))
3838
chgen.EXPECT().RefreshTokenSignature("").Return("")
3939
store.EXPECT().GetRefreshTokenSession(nil, "", nil).Return(nil, errors.New(""))
40-
chgen.EXPECT().AuthorizeCodeSignature("").Return("")
41-
store.EXPECT().GetAuthorizeCodeSession(nil, "", nil).Return(nil, errors.New(""))
4240
},
4341
expectErr: fosite.ErrRequestUnauthorized,
4442
},
@@ -50,8 +48,6 @@ func TestIntrospectToken(t *testing.T) {
5048
store.EXPECT().GetAccessTokenSession(nil, "asdf", nil).Return(nil, errors.New(""))
5149
chgen.EXPECT().RefreshTokenSignature("1234").Return("asdf")
5250
store.EXPECT().GetRefreshTokenSession(nil, "asdf", nil).Return(nil, errors.New(""))
53-
chgen.EXPECT().AuthorizeCodeSignature("1234").Return("asdf")
54-
store.EXPECT().GetAuthorizeCodeSession(nil, "asdf", nil).Return(nil, errors.New(""))
5551
},
5652
expectErr: fosite.ErrRequestUnauthorized,
5753
},
@@ -62,8 +58,6 @@ func TestIntrospectToken(t *testing.T) {
6258
chgen.EXPECT().ValidateAccessToken(nil, areq, "1234").Return(errors.WithStack(fosite.ErrTokenExpired))
6359
chgen.EXPECT().RefreshTokenSignature("1234").Return("asdf")
6460
store.EXPECT().GetRefreshTokenSession(nil, "asdf", nil).Return(nil, errors.New(""))
65-
chgen.EXPECT().AuthorizeCodeSignature("1234").Return("asdf")
66-
store.EXPECT().GetAuthorizeCodeSession(nil, "asdf", nil).Return(nil, errors.New(""))
6761
},
6862
expectErr: fosite.ErrTokenExpired,
6963
},

0 commit comments

Comments
 (0)