fix(auth-router): correct Protected Resource Metadata for pathful RS and add explicit resourceServerUrl (RFC 9728) #858
+20
−5
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #600
issuer
) and the protected resource (resource
) in the OAuth 2.0 Protected Resource Metadata (PRM).resource
server (RS) has a path (e.g.,http://host:port/mcp
), PRM is now also served at/.well-known/oauth-protected-resource/<path>
as required by RFC 9728.resourceServerUrl
inAuthRouterOptions
with fallback:resourceServerUrl ?? baseUrl ?? issuer
(keeps backward compatibility for AS=RS deployments).Motivation and Context
issuer
value in theresource
field and ignore the RS path.https://example.com/mcp
clients expect PRM athttps://example.com/.well-known/oauth-protected-resource/mcp
, but received the base well-known without the path and with an incorrectresource
.https://auth.example.com
, RS onhttps://example.com/mcp
).How Has This Been Tested?
Local app with split roles:
Checks:
OAuth authorization flow completed successfully; the “resource doesn't match expected” error disappeared.
Breaking Changes
None.
resourceServerUrl
is optional.Types of changes
Checklist
Additional context
/.well-known/oauth-protected-resource
before the RS path; theresource
value MUST exactly equal the RS identifier.getOAuthProtectedResourceMetadataUrl()
is updated accordingly to construct the path-specific well-known URL.