Repository navigation
feat!: approve a relying party's session step-up without its tokens - #431
Merged
Merged
Conversation
The page opens the step-up with its own session key and hands the wallet only the relying party's signed approve-request. approveSessionStepUp verifies it, asks for consent on the verified reason, and returns the signed approve-response for the page to send; the wallet makes no request to the relying party and is given no access or refresh token. stepUpVta and core's stepUpVtaStart / stepUpVtaFinish / performStepUpVta are replaced by approveSessionStepUp and verifyRpStepUpRequest / performRpStepUp. A step-up is bound to the origin's pinned RP DID only. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
stormer78
added a commit
to affinidi/affinidi-webvh-service
that referenced
this pull request
Nov 13, 2026
…StepUp Matches OpenVTC/vta-browser-plugin#431, and keeps it distinct from the wallet's existing approver method approveStepUp. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
11 tasks done
…nger sends Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
stormer78
added a commit
to affinidi/affinidi-webvh-service
that referenced
this pull request
Nov 13, 2026
…kens, and drop the login flow visualization (#445) * feat(ui)!: step a wallet session up without handing the wallet its tokens, and drop the login flow visualization The console now opens the step-up itself (auth/step-up/start, signed by the session key), hands the wallet only the control plane's signed approve-request, sends the wallet's signed approve-response, and renews the session with its own session key and refresh token. The wallet bridge method is approveStepUpRequest({ rpDid, approveRequest }); stepUpVta, which took the access and refresh tokens, is no longer called. The login page's 'Show flow visualization (demo)' option, its modal and the display-only token decoding behind it are removed. Signed-off-by: Glenn Gore <glenn.g@affinidi.com> * refactor(ui): name the wallet's session step-up method approveSessionStepUp Matches OpenVTC/vta-browser-plugin#431, and keeps it distinct from the wallet's existing approver method approveStepUp. Signed-off-by: Glenn Gore <glenn.g@affinidi.com> --------- Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
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.
Summary
The did-hosting console no longer hands the wallet a session's access and refresh tokens to step it up (affinidi/affinidi-webvh-service#445). The console opens the step-up itself with the session key its login bound, and asks the wallet only for the one thing a session key can never give: the holder's signed approval of the RP's challenge.
New page method:
window.vtaWallet.approveSessionStepUp({ rpDid, approveRequest })→{ approveResponse, holderDid }.approveRequestis the RP's signedauth/step-up/approve-request/0.5, exactly as the page got it back from its ownauth/step-up/start/0.2: a single-use challenge bound to that session and subject, with a short TTL.rpDidis the RP DID the origin is pinned to by an approved login (pageStepUpBindingRefusal, now RP-DID-only: the wallet contacts no one for a step-up, so the base URL pin no longer applies to it).performRpStepUp: verify (proof by an enrolled executor that isrpDid,authenticationpurpose, addressed to and naming the active holder, not lapsed,didSignedaccepted) → consent prompt on the verified reason (unchangedRUNTIME_STEP_UP_CONSENT, minusbaseUrl) → signapprove-response/0.7(assertionMethod). The page sends it and renews the session itself.Removed:
stepUpVta(page method, runtime/offscreen messages) and core'sstepUpVtaStart/stepUpVtaFinish/performStepUpVta. Per this repo's rule, no compatibility fold: the console and the wallet cut over together (the console PR never callsstepUpVta). The only consumer ofstepUpVtain the workspace was the did-hosting console.A side note on the old flow: it signed
auth/refresh/0.2with the holder's key, which the control plane refuses withauth/refresh:sessionKeyProofRequiredfor a session that bound a session key — the console's own renewal uses the bound key.demo/index.html's step-up button now explains the flow instead of calling the removed method (the demo holds no session key to open a step-up with).Behaviour changes (R3.6)
stepUpVta→approveSessionStepUp(different params and result). Breaking for any page callingstepUpVta.Tests
core/tests/rp-login.step-up.mjs:verifyRpStepUpRequestaccepts the RP's request for this holder and refuses another subject, another recipient, a lapsed request, another enrolled executor, a page-altered request and no document;performRpStepUpshows consent the verified reason and returns anassertionMethodapprove-response addressed to the RP, signs nothing on decline, and never prompts for a refused request. ExistingbuildStepUpApproval/verifyStepUpApproveRequesttests kept.extension/tests/page-rp-binding.test.mts: step-up binding by pinned RP DID, another RP refused, DIDComm-seeded pin (no base URL) allowed, missing/non-DIDrpDidrefused, unpinned origin refused.page-task-policy/approver-policytests updated for the method name.No suites were run locally; CI runs lint, build and tests.
Pre-merge checklist