fix(19.7): RC-WR-01 a backend grant acts only as the administrator it was consented for
pact.MCPGrant gains BackendUserID, the backend account the consent page showed. pier gives an OAuth identity a backend subject (on resolution and after a link event) only while the user's link names that account; a link to anyone else, or no recorded account, gives none, so a link changed after the consent never re-targets the grant.
This commit is contained in:
@@ -160,7 +160,7 @@ func (p *Plugin) Schedule() []pact.ScheduledCommand {
|
||||
| `pact.MCPGuards` | The registry of guard providers published on the application; `pact.NewMCPGuards` creates it, `Register` refuses an empty or duplicate name with a `pact:` error naming the guard, `Lookup` finds one and `Names` lists them sorted. Safe for concurrent use. |
|
||||
| `pact.MCPSubject` | The identity an MCP session acts as under one guard: guard name, user id, granted scopes, OAuth client id and personal token id. |
|
||||
| `pact.MCPDispatch` | A guard provider's answer for one call: the principal (as `any`), an optional credential and the bouncer guard names that honour the dispatch marker. |
|
||||
| `pact.MCPTokenVerifier` | Published by the OAuth server plugin: verifies an access token at the MCP endpoint into a `pact.MCPGrant` (user, client, token, scopes, expiry) and names its resource. A refused token is `pact.ErrMCPTokenInvalid`. |
|
||||
| `pact.MCPTokenVerifier` | Published by the OAuth server plugin: verifies an access token at the MCP endpoint into a `pact.MCPGrant` (user, client, token, scopes, expiry and, for a `backend` grant, `BackendUserID`, the backend account the consent showed) and names its resource. A refused token is `pact.ErrMCPTokenInvalid`. |
|
||||
| `pact.MCPPersonalTokenResolver` | Published by the one plugin whose personal tokens may open an MCP session (one resolver per application): resolves a raw token into a `pact.MCPSubject` whose `TokenID` identifies the token row (it keys the session binding; a subject without one is refused); false when the prefix is not its own, which the endpoint answers as unauthorized. |
|
||||
| `pact.MCPLinkedBackendResolver` | Published by the plugin that owns the frontend-to-backend account link: the `pact.LinkedBackendUser` (id, login, display name) of a frontend user, false when unlinked. |
|
||||
| `pact.MCPSubjectChanged` | Event fired on the festival bus when a subject's permissions, link, grants or existence change (`Kind` is `pact.MCPSubjectPermissions`, `pact.MCPSubjectLink`, `pact.MCPSubjectRevoked` or `pact.MCPSubjectDeleted`), so the MCP endpoint re-lists tools or ends sessions. `TokenID` and `ClientID` narrow a revoked event: a token id ends only the sessions that personal token opened (subject with that `TokenID` and no `ClientID`), a client id only that OAuth client's sessions, neither every session of the subject; other kinds ignore them. |
|
||||
|
||||
@@ -225,13 +225,20 @@ type MCPTokenVerifier interface {
|
||||
}
|
||||
|
||||
// MCPGrant is a verified OAuth access token: the frontend user, the client,
|
||||
// the token row, the granted scopes and the expiry.
|
||||
// the token row, the granted scopes, the expiry and, for a grant carrying
|
||||
// the backend scope, the backend account the user consented to.
|
||||
type MCPGrant struct {
|
||||
UserID uint
|
||||
ClientID string
|
||||
TokenID uint
|
||||
Scopes []string
|
||||
ExpiresAt time.Time
|
||||
// BackendUserID is the backend account the consent page showed when
|
||||
// the user granted the backend scope. The MCP endpoint gives the grant
|
||||
// a backend subject only while the user's current link names this
|
||||
// account, so a grant never acts as an administrator its consent did
|
||||
// not show; zero (none recorded) gives no backend subject.
|
||||
BackendUserID uint
|
||||
}
|
||||
|
||||
// ErrMCPTokenInvalid is what an MCPTokenVerifier answers for a token it does
|
||||
|
||||
Reference in New Issue
Block a user