Refresh
contact-auth
Refresh
Rotate a refresh token for a fresh access+refresh pair.
Resolution order:
- Try decoding the cookie. If signature + exp pass → use it.
- Else try decoding the body. If signature + exp pass → use it.
- If NEITHER source supplied a token → 401 refresh_token_missing.
- If at least one source supplied a token but NONE decoded → 401 refresh_token_invalid (preserves the pre-cookie error contract pinned by tests/contact_auth/test_error_codes.py).
Only the RESOLVED token is passed to service.refresh(). The service layer’s replay detection / token_version check / contact lookup are still authoritative — we never swallow those errors by retrying with another candidate.
POST
Refresh