4
4
"bytes"
5
5
"context"
6
6
"encoding/json"
7
+ "errors"
7
8
"fmt"
8
9
"log/slog"
9
10
"net"
@@ -42,14 +43,25 @@ func (p MockTokenParser) Parse(token string, _ jwt.Keyfunc) (*jwt.Token, error)
42
43
return nil , fmt .Errorf ("token not found" )
43
44
}
44
45
46
+ type ownerInvalid struct {}
47
+
48
+ func (o ownerInvalid ) TokenOwnerID (_ context.Context , _ string ) (string , error ) {
49
+ return auth .DefaultTokenOwnerID , nil
50
+ }
51
+
52
+ func (o ownerInvalid ) ValidateTokenOwnership (_ auth.TokenOwnershipValidationData , _ jwt.MapClaims ) error {
53
+ return errors .New ("invalid token owner" )
54
+ }
55
+
45
56
func TestNewServer (t * testing.T ) {
46
57
ctx := context .Background ()
47
58
48
59
setupEnv ()
49
60
defer teardownEnv ()
50
61
51
62
logger := slog .New (slog .NewJSONHandler (os .Stdout , & slog.HandlerOptions {Level : slog .LevelDebug , AddSource : false }))
52
- server , err := auth .NewServer (ctx , logger , InvalidParser {}, nil , nil )
63
+ defaultOwnership := & auth.DefaultTokenOwner {}
64
+ server , err := auth .NewServer (ctx , logger , InvalidParser {}, nil , defaultOwnership )
53
65
require .NoError (t , err )
54
66
require .NotNil (t , server )
55
67
@@ -96,7 +108,8 @@ func TestIntrospectForInvalidTokens(t *testing.T) {
96
108
}()
97
109
98
110
logger := slog .New (slog .NewJSONHandler (os .Stdout , & slog.HandlerOptions {Level : slog .LevelDebug , AddSource : false }))
99
- server , err := auth .NewServer (ctx , logger , InvalidParser {}, nil , nil )
111
+ defaultOwnership := & auth.DefaultTokenOwner {}
112
+ server , err := auth .NewServer (ctx , logger , InvalidParser {}, nil , defaultOwnership )
100
113
require .NoError (t , err )
101
114
require .NotNil (t , server )
102
115
@@ -138,6 +151,7 @@ func TestIntrospectForValidTokens(t *testing.T) {
138
151
name string
139
152
token string
140
153
tokenParser auth.TokenParser
154
+ invalidOwner bool
141
155
expectedStatus int
142
156
expectedAudience []string
143
157
expectedSubject string
@@ -201,6 +215,35 @@ func TestIntrospectForValidTokens(t *testing.T) {
201
215
expectedClientID : "client123" ,
202
216
expectedUsername : "testuser" ,
203
217
},
218
+ {
219
+ name : "Valid Token with invalid owner" ,
220
+ token : testToken ,
221
+ tokenParser : & MockTokenParser {
222
+ tokenMap : map [string ]jwt.Token {
223
+ testToken : {
224
+ Claims : jwt.MapClaims {
225
+ "iss" : "https://auth.example.com" ,
226
+ "sub" : "user123" ,
227
+ "aud" : "api" ,
228
+ "exp" : time .Now ().Add (time .Hour ).Unix (),
229
+ "iat" : time .Now ().Unix (),
230
+ "client_id" : "client123" ,
231
+ "scope" : "read write" ,
232
+ "username" : "testuser" ,
233
+ },
234
+ Valid : true ,
235
+ },
236
+ },
237
+ },
238
+ invalidOwner : true ,
239
+ expectedStatus : http .StatusForbidden ,
240
+ expectedAudience : []string {"api" },
241
+ expectedSubject : "user123" ,
242
+ expectedScope : "read write" ,
243
+ expectedIssuer : "https://auth.example.com" ,
244
+ expectedClientID : "client123" ,
245
+ expectedUsername : "testuser" ,
246
+ },
204
247
}
205
248
206
249
// Setup a test server to mock the OAuth2 server
@@ -238,7 +281,11 @@ func TestIntrospectForValidTokens(t *testing.T) {
238
281
t .Run (test .name , func (t * testing.T ) {
239
282
ctx := context .Background ()
240
283
241
- server , err := auth .NewServer (ctx , logger , test .tokenParser , nil , nil )
284
+ var ownerProvider auth.TokenOwnershipProvider = & auth.DefaultTokenOwner {}
285
+ if test .invalidOwner {
286
+ ownerProvider = ownerInvalid {}
287
+ }
288
+ server , err := auth .NewServer (ctx , logger , test .tokenParser , nil , ownerProvider )
242
289
require .NoError (t , err )
243
290
require .NotNil (t , server )
244
291
@@ -252,7 +299,10 @@ func TestIntrospectForValidTokens(t *testing.T) {
252
299
resp , err := makeIntrospectRequest (testServer .URL , test .token )
253
300
254
301
require .NoError (t , err )
255
- require .Equal (t , http .StatusOK , resp .StatusCode )
302
+ require .Equal (t , test .expectedStatus , resp .StatusCode )
303
+ if resp .StatusCode < http .StatusOK || resp .StatusCode >= http .StatusMultipleChoices {
304
+ return
305
+ }
256
306
257
307
defer func () {
258
308
_ = resp .Body .Close ()
0 commit comments