@@ -40,14 +40,19 @@ func setupTestKeySet(t *testing.T) (oidc.KeySet, *rsa.PrivateKey, string) {
4040 return keySet , privateKey , issuer
4141}
4242
43- func createAccessToken (t * testing.T , privateKey * rsa.PrivateKey , issuer string , scopes []string , subject string ) string {
43+ func createAccessToken (t * testing.T , privateKey * rsa.PrivateKey , issuer string , audience string , scopes []string , subject string ) string {
4444 now := stdtime .Now ().UTC ()
4545 expirationTime := libtime .New (now .Add (1 * stdtime .Hour ))
4646
47+ audiences := make ([]string , 0 , 1 )
48+ if audience != "" {
49+ audiences = append (audiences , audience )
50+ }
51+
4752 accessTokenClaims := oidc .NewAccessTokenClaims (
4853 issuer ,
4954 subject ,
50- [] string { "test-client" } ,
55+ audiences ,
5156 expirationTime ,
5257 "test-jti" ,
5358 "test-client" ,
@@ -82,17 +87,23 @@ func createAccessTokenWithOrgClaims(
8287 t * testing.T ,
8388 privateKey * rsa.PrivateKey ,
8489 issuer string ,
90+ audience string ,
8591 scopes []string ,
8692 subject string ,
8793 organizationID string ,
8894) string {
8995 now := stdtime .Now ().UTC ()
9096 expirationTime := libtime .New (now .Add (1 * stdtime .Hour ))
9197
98+ audiences := make ([]string , 0 , 1 )
99+ if audience != "" {
100+ audiences = append (audiences , audience )
101+ }
102+
92103 accessTokenClaims := oidc .NewOrganizationAwareAccessTokenClaims (
93104 issuer ,
94105 subject ,
95- [] string { "test-client" } ,
106+ audiences ,
96107 expirationTime ,
97108 "test-jti" ,
98109 "test-client" ,
@@ -143,7 +154,7 @@ func TestJWTAuth_Authenticate(t *testing.T) {
143154 auth := NewJWTAuth (keySet , issuer , "test-service" , false , []AdditionalCheck {})
144155
145156 // Create access token
146- token := createAccessToken (t , privateKey , issuer , []string {}, "test-user" )
157+ token := createAccessToken (t , privateKey , issuer , "" , []string {}, "test-user" )
147158
148159 // Create request with valid token
149160 req := httptest .NewRequest ("GET" , "/test" , nil )
@@ -330,7 +341,7 @@ func TestJWTAuth_Authenticate(t *testing.T) {
330341 t .Run (tt .name , func (t * testing.T ) {
331342
332343 // Create access token with read scope
333- token := createAccessToken (t , privateKey , issuer , []string {"test-service:read" }, "test-user" )
344+ token := createAccessToken (t , privateKey , issuer , "" , []string {"test-service:read" }, "test-user" )
334345
335346 req := httptest .NewRequest ("GET" , "/test" , nil )
336347 req .Header .Set ("Authorization" , "Bearer " + token )
@@ -364,7 +375,7 @@ func TestJWTAuth_Authenticate(t *testing.T) {
364375 for _ , tt := range tests {
365376 t .Run (tt .name , func (t * testing.T ) {
366377 // Create access token with write scope
367- token := createAccessToken (t , privateKey , issuer , []string {"test-service:write" }, "test-user" )
378+ token := createAccessToken (t , privateKey , issuer , "" , []string {"test-service:write" }, "test-user" )
368379
369380 req := httptest .NewRequest ("POST" , "/test" , nil )
370381 req .Header .Set ("Authorization" , "Bearer " + token )
@@ -398,7 +409,7 @@ func TestJWTAuth_Authenticate(t *testing.T) {
398409 for _ , tt := range tests {
399410 t .Run (tt .name , func (t * testing.T ) {
400411 // Create access token with only read scope (not enough for POST)
401- token := createAccessToken (t , privateKey , issuer , []string {"test-service:read" }, "test-user" )
412+ token := createAccessToken (t , privateKey , issuer , "" , []string {"test-service:read" }, "test-user" )
402413
403414 req := httptest .NewRequest ("POST" , "/test" , nil )
404415 req .Header .Set ("Authorization" , "Bearer " + token )
@@ -433,7 +444,7 @@ func TestJWTAuth_Authenticate(t *testing.T) {
433444 for _ , tt := range tests {
434445 t .Run (tt .name , func (t * testing.T ) {
435446 // Create access token with write scope
436- token := createAccessToken (t , privateKey , issuer , []string {"test-service:write" }, "test-user" )
447+ token := createAccessToken (t , privateKey , issuer , "" , []string {"test-service:write" }, "test-user" )
437448
438449 req := httptest .NewRequest ("GET" , "/test" , nil )
439450 req .Header .Set ("Authorization" , "Bearer " + token )
@@ -468,7 +479,7 @@ func TestJWTAuth_Authenticate(t *testing.T) {
468479 for _ , tt := range tests {
469480 t .Run (tt .name , func (t * testing.T ) {
470481 // Create access token
471- token := createAccessToken (t , privateKey , unexpectedIssuer , []string {}, "test-user" )
482+ token := createAccessToken (t , privateKey , unexpectedIssuer , "" , []string {}, "test-user" )
472483
473484 // Create request with valid token
474485 req := httptest .NewRequest ("GET" , "/test" , nil )
@@ -508,7 +519,7 @@ func TestJWTAuth_Authenticate(t *testing.T) {
508519 auth := NewJWTAuth (keySet , issuer , "test-service" , false , autoFailingAdditionalChecks )
509520
510521 // Create access token
511- token := createAccessToken (t , privateKey , issuer , []string {}, "test-user" )
522+ token := createAccessToken (t , privateKey , issuer , "" , []string {}, "test-user" )
512523
513524 // Create request with valid token
514525 req := httptest .NewRequest ("GET" , "/test" , nil )
@@ -535,7 +546,7 @@ func TestJWTAuth_Authenticate(t *testing.T) {
535546 auth := NewJWTAuth (keySet , issuer , "test-service" , false , additionalChecks )
536547
537548 // Create access token
538- token := createAccessTokenWithOrgClaims (t , privateKey , issuer , []string {}, "test-user" , expectedOrgID )
549+ token := createAccessTokenWithOrgClaims (t , privateKey , issuer , "" , []string {}, "test-user" , expectedOrgID )
539550
540551 // Create request with valid token
541552 req := httptest .NewRequest ("GET" , "/test" , nil )
@@ -558,7 +569,7 @@ func TestJWTAuth_Authenticate(t *testing.T) {
558569 auth := NewJWTAuth (keySet , issuer , "test-service" , false , additionalChecks )
559570
560571 // Create access token
561- token := createAccessTokenWithOrgClaims (t , privateKey , issuer , []string {}, "test-user" , "" )
572+ token := createAccessTokenWithOrgClaims (t , privateKey , issuer , "" , []string {}, "test-user" , "" )
562573
563574 // Create request with valid token
564575 req := httptest .NewRequest ("GET" , "/test" , nil )
@@ -582,7 +593,7 @@ func TestJWTAuth_Authenticate(t *testing.T) {
582593 auth := NewJWTAuth (keySet , issuer , "test-service" , false , additionalChecks )
583594
584595 // Create access token
585- token := createAccessTokenWithOrgClaims (t , privateKey , issuer , []string {}, "test-user" , "someotherorgid" )
596+ token := createAccessTokenWithOrgClaims (t , privateKey , issuer , "" , []string {}, "test-user" , "someotherorgid" )
586597
587598 // Create request with valid token
588599 req := httptest .NewRequest ("GET" , "/test" , nil )
@@ -607,7 +618,7 @@ func TestJWTAuth_Authenticate(t *testing.T) {
607618 auth := NewJWTAuth (keySet , issuer , "test-service" , false , additionalChecks )
608619
609620 // Create access token
610- token := createAccessTokenWithOrgClaims (t , privateKey , issuer , []string {}, "test-user" , "" )
621+ token := createAccessTokenWithOrgClaims (t , privateKey , issuer , "" , []string {}, "test-user" , "" )
611622
612623 // Create request with valid token
613624 req := httptest .NewRequest ("GET" , "/test" , nil )
@@ -619,4 +630,52 @@ func TestJWTAuth_Authenticate(t *testing.T) {
619630 assert .ErrorIs (t , err , oidc .ErrOrgIDNotPresent )
620631 assert .False (t , authenticated )
621632 })
633+
634+ t .Run ("CheckAudienceClaim audience mismatches" , func (t * testing.T ) {
635+ t .Parallel ()
636+ keySet , privateKey , issuer := setupTestKeySet (t )
637+ expectedAudience := "http://expected.mydomain.com"
638+
639+ additionalChecks := []AdditionalCheck {
640+ CheckAudienceClaim (expectedAudience ),
641+ }
642+ auth := NewJWTAuth (keySet , issuer , "test-service" , false , additionalChecks )
643+
644+ // Create access token
645+ token := createAccessTokenWithOrgClaims (t , privateKey , issuer , "" , []string {}, "test-user" , "" )
646+
647+ // Create request with valid token
648+ req := httptest .NewRequest ("GET" , "/test" , nil )
649+ req .Header .Set ("Authorization" , "Bearer " + token )
650+ req = req .WithContext (logging .TestingContext ())
651+
652+ authenticated , err := auth .Authenticate (nil , req )
653+ require .Error (t , err )
654+ assert .ErrorIs (t , err , oidc .ErrAudience )
655+ assert .False (t , authenticated )
656+ })
657+
658+ t .Run ("CheckAudienceClaim audience matches" , func (t * testing.T ) {
659+ t .Parallel ()
660+ keySet , privateKey , issuer := setupTestKeySet (t )
661+ expectedAudience := "http://expected.mydomain.com"
662+
663+ additionalChecks := []AdditionalCheck {
664+ CheckAudienceClaim (expectedAudience ),
665+ }
666+ auth := NewJWTAuth (keySet , issuer , "test-service" , false , additionalChecks )
667+
668+ // Create access token
669+ tokenAudience := expectedAudience
670+ token := createAccessTokenWithOrgClaims (t , privateKey , issuer , tokenAudience , []string {}, "test-user" , "" )
671+
672+ // Create request with valid token
673+ req := httptest .NewRequest ("GET" , "/test" , nil )
674+ req .Header .Set ("Authorization" , "Bearer " + token )
675+ req = req .WithContext (logging .TestingContext ())
676+
677+ authenticated , err := auth .Authenticate (nil , req )
678+ require .NoError (t , err )
679+ assert .True (t , authenticated )
680+ })
622681}
0 commit comments