Skip to content

Commit 0190c54

Browse files
sea-snakeclaude
andcommitted
docs: a silent request never gets a rendered error
The failure table put callback and derivation-origin validation outside the single outcome, as the existing redirect-transport error. For a silent request the implementation answers `interaction_required` like every other failure, because rendering a full-page error inside what the user sees as their own app is the thing this design exists to avoid. Also gave the two pieces of browser state their storage and their keys. They were described in a sentence with no table under a Constants heading, which read as the lead-in to something deleted, and were the only mention of state an implementer has to reproduce exactly. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent dfd7faf commit 0190c54

1 file changed

Lines changed: 13 additions & 11 deletions

File tree

docs/ongoing/silent-reauth-redirect-spec.md

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,13 @@ The same fact makes sign-out propagate. "Sign out of one and the others follow"
119119

120120
## Failure modes
121121

122-
| Situation | Outcome |
123-
| ---------------------------------------------------------------- | ------------------------------------------------ |
124-
| No session held | `interaction_required` |
125-
| Session expired, or revoked from another app or from II settings | `interaction_required` |
126-
| Hint resolves to another origin's session | `interaction_required` |
127-
| Several sessions and no hint | `interaction_required` |
128-
| Callback or derivation origin fails validation | The existing redirect-transport error, unchanged |
122+
| Situation | Outcome |
123+
| ---------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
124+
| No session held | `interaction_required` |
125+
| Session expired, or revoked from another app or from II settings | `interaction_required` |
126+
| Hint resolves to another origin's session | `interaction_required` |
127+
| Several sessions and no hint | `interaction_required` |
128+
| Callback or derivation origin fails validation | `interaction_required` for a silent request, the existing redirect-transport error otherwise |
129129

130130
One outcome for every session-related case, so a client's fallback is a single branch. That is not to hide anything: the `prompt=none` rules above already bound what it can be used to learn, since it only ever answers for the requesting origin.
131131

@@ -141,10 +141,12 @@ One outcome for every session-related case, so a client's fallback is a single b
141141
| Reason values | `login_required`, `account_selection_required` | Carried in the error payload. A client may use them to word its prompt; it does not have to branch on them |
142142
| Local record expiry margin | 5 minutes | A record within this of its expiry is not treated as usable, so a chain is never handed over that dies mid-request |
143143

144-
Two pieces of frontend state this design relies on. The two authorize-URL parameters are
145-
journalled so they survive a round trip through an external identity provider, and the
146-
browser id is cached per identity so a returning browser is recognised rather than
147-
re-registered.
144+
Two pieces of browser state this relies on:
145+
146+
| State | Where | Why |
147+
| -------------------------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------- |
148+
| The two authorize-URL parameters | `sessionStorage`, keyed per authorize request | They must survive a round trip through an external identity provider, which navigates away and back |
149+
| The browser id | `localStorage`, keyed per identity | A returning browser is recognised rather than registered again |
148150

149151
## Requirements
150152

0 commit comments

Comments
 (0)