@@ -1403,22 +1403,50 @@ func TestRFC8707ResourceIndicators(t *testing.T) {
14031403
14041404 waitForMCPFront (t )
14051405
1406- t .Run ("ProtectedResourceMetadataEndpoint" , func (t * testing.T ) {
1406+ t .Run ("BaseProtectedResourceMetadataReturns404" , func (t * testing.T ) {
1407+ // Base metadata endpoint should return 404, directing clients to per-service endpoints
14071408 resp , err := http .Get ("http://localhost:8080/.well-known/oauth-protected-resource" )
14081409 require .NoError (t , err )
14091410 defer resp .Body .Close ()
14101411
1411- assert .Equal (t , 200 , resp .StatusCode , "Protected resource metadata endpoint should exist" )
1412+ assert .Equal (t , 404 , resp .StatusCode , "Base protected resource metadata endpoint should return 404" )
1413+
1414+ var errResp map [string ]any
1415+ err = json .NewDecoder (resp .Body ).Decode (& errResp )
1416+ require .NoError (t , err )
1417+
1418+ assert .Contains (t , errResp ["message" ], "per-service" , "Error message should direct to per-service endpoints" )
1419+ })
1420+
1421+ t .Run ("PerServiceProtectedResourceMetadataEndpoint" , func (t * testing.T ) {
1422+ // Per-service metadata endpoint should return service-specific resource URI
1423+ resp , err := http .Get ("http://localhost:8080/.well-known/oauth-protected-resource/test-sse" )
1424+ require .NoError (t , err )
1425+ defer resp .Body .Close ()
1426+
1427+ assert .Equal (t , 200 , resp .StatusCode , "Per-service protected resource metadata endpoint should exist" )
14121428
14131429 var metadata map [string ]any
14141430 err = json .NewDecoder (resp .Body ).Decode (& metadata )
14151431 require .NoError (t , err )
14161432
1417- assert .Equal (t , "http://localhost:8080" , metadata ["resource" ])
1433+ // Resource should be service-specific, not base URL
1434+ assert .Equal (t , "http://localhost:8080/test-sse" , metadata ["resource" ],
1435+ "Resource should be service-specific URL" )
14181436
14191437 authzServers , ok := metadata ["authorization_servers" ].([]any )
14201438 require .True (t , ok , "Should have authorization_servers array" )
14211439 require .NotEmpty (t , authzServers )
1440+ assert .Equal (t , "http://localhost:8080" , authzServers [0 ],
1441+ "Authorization server should be base issuer" )
1442+ })
1443+
1444+ t .Run ("UnknownServiceReturns404" , func (t * testing.T ) {
1445+ resp , err := http .Get ("http://localhost:8080/.well-known/oauth-protected-resource/nonexistent-service" )
1446+ require .NoError (t , err )
1447+ defer resp .Body .Close ()
1448+
1449+ assert .Equal (t , 404 , resp .StatusCode , "Unknown service should return 404" )
14221450 })
14231451
14241452 t .Run ("TokenWithResourceParameter" , func (t * testing.T ) {
@@ -1517,5 +1545,33 @@ func TestRFC8707ResourceIndicators(t *testing.T) {
15171545 wwwAuth := streamableResp .Header .Get ("WWW-Authenticate" )
15181546 assert .Contains (t , wwwAuth , "Bearer resource_metadata=" ,
15191547 "401 response should include RFC 9728 WWW-Authenticate header" )
1548+ // Per RFC 9728 Section 5.2, the metadata URI should be service-specific
1549+ assert .Contains (t , wwwAuth , "/.well-known/oauth-protected-resource/test-streamable" ,
1550+ "401 response should point to per-service metadata endpoint" )
1551+ })
1552+
1553+ t .Run ("401ResponseIncludesServiceSpecificMetadataURI" , func (t * testing.T ) {
1554+ // Request to a protected endpoint without token should get 401
1555+ // with service-specific metadata URI in WWW-Authenticate header
1556+ client := & http.Client {
1557+ CheckRedirect : func (req * http.Request , via []* http.Request ) error {
1558+ return http .ErrUseLastResponse
1559+ },
1560+ }
1561+
1562+ req , _ := http .NewRequest ("GET" , "http://localhost:8080/test-sse/sse" , nil )
1563+ req .Header .Set ("Accept" , "text/event-stream" )
1564+
1565+ resp , err := client .Do (req )
1566+ require .NoError (t , err )
1567+ defer resp .Body .Close ()
1568+
1569+ assert .Equal (t , 401 , resp .StatusCode , "Request without token should return 401" )
1570+
1571+ wwwAuth := resp .Header .Get ("WWW-Authenticate" )
1572+ assert .Contains (t , wwwAuth , "Bearer resource_metadata=" ,
1573+ "401 response should include RFC 9728 WWW-Authenticate header" )
1574+ assert .Contains (t , wwwAuth , "/.well-known/oauth-protected-resource/test-sse" ,
1575+ "401 response should point to test-sse specific metadata endpoint" )
15201576 })
15211577}
0 commit comments