docs: write down the four decisions an integration has to make - #73
Merged
Conversation
42-v
enabled auto-merge (squash)
August 26, 2026 15:30
The first real integration surfaced four questions that are not bugs and not features. Each is a place where what vault42 does and what a relying party expects differ for a reason, and where the answer is a decision somebody has to write down rather than a gap somebody has to close. Undocumented, each one gets rediscovered during a cutover, which is the worst time to be deciding it. Two audiences, one validator. A minted token must not carry vault42's own audience, or the holder of the mint scope turns "assert a subject downstream" into "act as that subject here" -- the audience rule and the token_type claim are two independent controls saying the same thing. The relying party accepts an audience set. Service-to-service identity stays with the platform. vault42 is the authority on who a user is, not on whether your notifications service may call your payments service. Routing that through a signing oracle buys central configuration and costs a runtime dependency on vault42 for every internal call, on a path with no user in it. If it must be centralised, the honest shape is a client-credentials token carrying a role set rather than one role, which is a small change and weakens nothing. Revocation is bounded, not immediate. Per-request introspection is the exact cost self-contained tokens exist to avoid and would put vault42 on every path rather than the login path. So the guarantee is stated instead: a ban stops renewal immediately and stops access within the access-token TTL, fifteen minutes by default. The document says that number out loud and lists the three ways to shrink the window, with per-call introspection explicitly not among them. Minted tokens stay short. The ceiling is the only bound on a leaked assertion, because vault42 keeps no record of a minted token beyond the audit event, so it is a control rather than a default. The caller re-mints; 60 per minute per client against one mint per user per fifteen minutes is about 900 concurrent users, and a service minting per request rather than per session hits it far sooner, which is the intended pressure. It also states the two things vault42 will not assert -- a minted email is the caller's word, and X-Vault-App is not tenancy -- because both are read the other way from outside. Every figure is taken from the source rather than remembered: VAULT_ACCESS_TOKEN_TTL's 15m default from config.go:108, the fail-closed 60/min from api.md's mint section, AR-16 from security.md:326, and the tenancy statement from spec.md section 0.8.
42-v
force-pushed
the
docs/relying-parties
branch
from
August 26, 2026 17:43
25ed806 to
8e9ddcc
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Merging this publishes nothing. vault42 releases are cut by pushing the annotated tag.
Why
The BeOn3 gap analysis produced 8 cutover blockers. Four were code and are being closed (#68 email claim, #71 role grants, plus the role-claim one that turned out to need no vault42 change). The other four are not bugs and not features — they are places where what vault42 does and what a relying party expects differ for a reason.
Undocumented, each gets rediscovered during a cutover, which is the worst possible time to be deciding it.
docs/relying-parties.mddecides them.The four
Two audiences, one validator. A minted token must not carry vault42's own audience, or the holder of the mint scope turns "assert a subject downstream" into "act as that subject here." The audience rule and the
token_type: mintclaim are two independent controls saying the same thing, so collapsing them removes one. The relying party accepts an audience set — and if eleven services each hand-roll their own validation, that is an argument for the shared wrapper rather than against the plural.Service-to-service identity stays with the platform. vault42 is the authority on who a user is, not on whether your notifications service may call your payments service. Routing that through a signing oracle buys central configuration and costs a runtime dependency on vault42 for every internal call, on a path with no user in it. If it must be centralised anyway, the honest shape is a
/client/tokencarrying a role set rather than one role — small, and it weakens nothing, because those tokens already carryclient_idand already sit in vault42's own audience. Ask for that rather than working around it by minting an admin-ish subject.Revocation is bounded, not immediate. Per-request introspection is precisely the cost self-contained tokens exist to avoid, and it would move vault42 from the login path onto every path with the availability requirements that implies. So the guarantee is stated instead: a ban stops renewal immediately and stops access within the access-token TTL — fifteen minutes by default. The doc says that number out loud and lists the three ways to shrink the window, with per-call introspection explicitly not among them.
Minted tokens stay short. The ceiling is the only bound on a leaked assertion, because vault42 keeps no record of a minted token beyond the audit event — so it is a control, not a default. Raising it to 60 minutes would quadruple the exposure of every leaked assertion to buy a scheduling convenience. The caller re-mints: 60/min per client against one mint per user per fifteen minutes is ~900 concurrent users, and a service minting per request rather than per session hits it far sooner. That is the intended pressure.
Also stated
The two things vault42 will not assert, because both are read the other way from outside: a minted
emailis the caller's word about a subject vault42 never looked up, andX-Vault-Appis routing and branding, not tenancy.Verification
Every figure is taken from the source rather than remembered:
docs/README.mdsays "Adding a document means adding a row here", so it has one.