Fresh proof each time
Every product request carries a signed JWT with a short expiry and a unique request ID. Reused IDs are rejected during the replay window.
Switcher helps connected applications hand a person off without sharing sessions. Each backend proves who it is, Switcher checks the identity link, and the destination verifies the one-time ticket before creating its own session.
A few small protocol choices make stolen credentials harder to replay and account-linking mistakes harder to hide.
Every product request carries a signed JWT with a short expiry and a unique request ID. Reused IDs are rejected during the replay window.
HS256 secrets stay in backend environments. With RS256, Switcher stores only the public key; the app keeps the private key.
Stable identity anchors take priority. Conflicting contact matches enter an operator queue instead of silently joining accounts.
Tier 3 handoffs require a linked account with step-up verification. The target app still checks the account and creates its own session.
A quick threat model: what happens if someone copies a request, changes a claim, or steals a handoff link?
Could a captured API call be resent to create another handoff?
Every call needs a fresh jti (one-time request ID). Repeats are rejected for 120 seconds.
What if someone edits the signed identity or swaps the service name?
Changed claims fail signature verification. The issuer and signing key must match a registered service.
Could a second browser session spend a ticket that was already used?
Tickets expire after 30 seconds, work for the intended service account, and can be redeemed once.
Switcher checks who signed, which key signed it, which user it represents, and whether the request is fresh. A signature alone does not make a handoff trustworthy.
It only proves that a handoff was authorized. The destination backend must authenticate the exact target account, apply its own permissions, and establish its own session. Keep that boundary in your app.