fix(client)!: request OTP generation over POST#103
Merged
Conversation
Contributor
Author
|
Adapter half: fells-code/seamless-auth-server#109. Both must land and publish together. |
This was referenced Jul 20, 2026
Bccorb
force-pushed
the
fix/otp-generate-post
branch
from
July 20, 2026 19:18
74fe066 to
507d593
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Request OTP generation over
POSTinstead ofGETfor all four generate methods, closing the same CSRF vector fixed forrequestMagicLink.requestPhoneOtp,requestEmailOtp,requestLoginPhoneOtp,requestLoginEmailOtpCloses #101.
Why
Each of these methods causes an SMS or email to be sent, so they are state changing. As a bodyless
GET, they were simple cross-site requests, so an<img src>on any page could trigger unbounded OTP messages to a signed-in user (SMS toll fraud and inbox spam). I confirmed the precondition against the adapter: the session cookie defaults toSameSite=Nonein a secure deployment, so it rides along on cross-site GETs.Each now sends
POSTwith an empty JSON body. The body is what matters: it makesfetchWithAuthdeclare a JSON content type, which forces a CORS preflight and makes the route unreachable cross-site. A bodyless POST would still be a simple request. This mirrors therequestMagicLinkfix exactly.Coordinated release
BREAKING. The adapter half is fells-code/seamless-auth-server#109, which serves these routes over POST. The two must ship together: an older adapter 404s this SDK, and an older SDK issuing GET 404s against the new adapter. Same lockstep as the magic-link change tracked in #100.
Tests
POSTwith an empty JSON bodyFull suite: 223 passed.
Checks
npm run typecheck,npm run lint,npm run format:checkclean