Opt-in sign_in step-up (force_verify / prompt=login), app-authenticated, signed-state flag #11
Loading…
Reference in a new issue
No description provided.
Delete branch "heimdall/signin-step-up"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes follow-up
joystick:follow_up:chat-s7055-7056. Not deployed, not merged. Context:/opt/commons/handoff/streampixels-link-hardening-map.mdandheimdall-answers-streampixels-link-20261112.md(second factor: a fresh sign-in through an identity already on the target).What changed
POST /v1/oauth/{provider}/startacceptsstepUp: true, sign_in only, off by default (falseequals absent).401 app_auth_required.linkorconnectwithstepUpis400 step_up_only_in_sign_in.step_upin the state JWT (src/app.tsbuild and parse; a non-truevalue fails the parse). The launch hop reads it from the state only. AstepUpin a redeem body is ignored; the completion reportsstepUpRequested: trueonly when the start asked.stepUpAuthorizationParams,src/providers.ts): Twitchforce_verify=true; YouTubeprompt=login consent; Googleprompt=login. Any other provider is400 step_up_not_supportedat start, andbuildAuthorizationUrlthrows instead of omitting the step.docs/service-contract.md(start section). Changelog: the repo has no changelog file; the line is an evidence record instate/evidence.jsonl.tests/step-up.test.ts(StreamPixels start with and without step-up for twitch and youtube, Google via Bifrost, 401 without secret, refusal for discord, mode refusal, state-only flag). One pinned count intests/caller-identity-attack-soul-r21.test.tsgoes from 3 to 4 guardedcaller.appSlugreads because the new gate adds one. Full suite 652 passed, typecheck clean.Limits, stated
prompt=loginforces re-authentication. Twitchforce_verifyre-shows the authorize page: it proves someone at the browser chose to continue, not that credentials were entered. The doc says a consumer that needs credentials must not rely on Twitch step-up.stepUpRequestedmeans "asked".stepUp.For Soul to falsify
step_up, in every mode and provider, including through the private command plane'sbeginAuth.step_upis read from the verified state only: a hand-built state withstep_upas a string orfalseis rejected or ignored; nothing on callback or redeem input changes the provider URL orstepUpRequested.stepUpeither adds its parameter or is refused at start; no path yields an authorize URL without the step for a step-up state (including a state signed before this change, which has nostep_up).caller.appSlugread really is guarded; check the R21.2 count edit is the only test change and not a loosening.prompt=loginand YouTube'slogin consentoverride the existingselect_account/consentvalues, not append a secondprompt.🤖 Generated with Claude Code