This commit is contained in:
@@ -85,5 +85,22 @@ ceremony until expiry. A binding mismatch consumes the mismatched ceremony.
|
||||
Applications must use generic failure responses and the same credential-attempt
|
||||
rate limiting as login.
|
||||
|
||||
Owner-assisted recovery is a third, deliberately separate path. Configure
|
||||
`authrecovery.Options.OwnerRole`, authorize an active direct organization owner,
|
||||
and bind that owner's fresh passkey assertion to the exact organization,
|
||||
target user, request identifier, and bounded human-review reason before calling
|
||||
`IssueAssistedRecovery`. The SQLite transaction rechecks the active direct
|
||||
owner and target membership, invalidates the target's password, passkeys,
|
||||
recovery codes, sessions, and pending ceremonies, then stores only a digest of
|
||||
the 15-minute grant with identity and organization-visible audits.
|
||||
|
||||
Deliver the returned grant exactly once in a URL fragment. A public recovery
|
||||
page can pass it to `BeginAssistedPasskey` and `FinishAssistedRecovery` while
|
||||
keeping it out of request URLs, referrers, and access logs. Completion consumes
|
||||
the grant atomically with one replacement password, passkey, recovery-code set,
|
||||
and both audit trails. It issues no session. Losing the fragment after issuance
|
||||
requires another reviewed owner or root-local recovery; old authenticators
|
||||
must not become valid again as a fallback.
|
||||
|
||||
Before enabling production mutations, applications should require at least two
|
||||
independent passkeys and complete a local recovery drill.
|
||||
|
||||
Reference in New Issue
Block a user