
Authentication is the front door to any on-chain application. One-Time Password (OTP) login via email and SMS provides a familiar, passwordless experience that balances accessibility with robust security, ensuring that users can manage their wallets without the burden of traditional credentials.
What is OTP Authentication and Why Use It?
OTP (One-Time Password) authentication is a specialized security mechanism where a short-lived code is sent to a user’s email or phone to verify their identity. In the context of embedded wallets, OTP acts as a "passwordless" alternative that avoids the risks of credential stuffing and password reuse. Because the code expires typically within minutes and is valid only for a single use, it ensures that a stolen credential from another site cannot be used to access a user's wallet. Openfort integrates OTP natively into its SDKs, allowing developers to implement secure social and mobile-based onboarding flows without the UX friction of managing complex passwords or seed phrases.
Because in embedded wallets, authentication isn’t just “log this user in.” It’s the front door to key recovery, session continuity, and the whole “who is allowed to sign what” question. If auth is shaky, everything downstream becomes a support ticket—or worse, a postmortem.
So today we’re shipping One-Time Password (OTP) authentication via email and phone number (SMS) in Openfort. The goal is simple: give you a passwordless login option that users already understand, without forcing you to become an identity company on the side.
If you’re using Openfort’s UI, OTP can be enabled and you move on. If you’re building your own UX, OTP is exposed via hooks in both React and React Native.
The Password Hangover
Passwords aren’t “dead.” They’re just… tired.
They’re reused, phished, leaked, and then stored indefinitely because the system requires a long-lived secret. Even if you do everything right, you’re still building a mechanism whose default failure mode is: “someone somewhere reused a credential and now it’s your problem.”
OTPs dodge most of that by refusing to be a permanent secret. You don’t store a password forever. You prove control right now—over an email inbox or a phone number—and then the credential evaporates.
It turns out the best security upgrade is often the least glamorous one: make stolen credentials worthless by design.
What an OTP is (one tight definition)
A one-time password is a short-lived code that’s valid once (and typically expires within minutes). It’s a transient proof that the user controls a delivery channel—email or phone—at the moment they’re trying to authenticate.

The OTP Sandwich: security vs UX (email vs SMS)
People often ask: “Which is better, email OTP or SMS OTP?”
Email OTP is the dependable fallback. It works anywhere the internet works, it’s familiar, and for many products it’s the best “passwordless default.” If the user’s inbox is well-protected, it’s surprisingly strong.
SMS OTP is frictionless on mobile. It’s fast, globally understood, and often the smoothest path from “first open” to “first successful action.”
But SMS comes with a known trade: it’s more exposed to telco-layer fraud (SIM swap, social engineering). That doesn’t mean “don’t use SMS.” It means “don’t pretend SMS is a hardware key.” For higher-risk actions, you treat SMS/email OTP as a baseline and layer up when needed.
What we shipped in Openfort
We added OTP support for both email and phone number so you can run passwordless authentication flows cleanly in Openfort’s auth stack, for example with React and React Native.

One detail builders tend to appreciate: in React, phone OTP also supports linking a phone number to an already-authenticated user (linkPhoneOtp). That’s useful if you start with email login, then later want to add a phone factor for step-up verification or account hardening—without forcing a new account or a messy migration.

The Builder Rule: don’t “roll your own” identity perimeter
The theory is: “OTP is easy, it’s just a code.” The reality is: it’s a mini security system:
- You need short expiries and single-use semantics.
- You need rate limits (request + verify).
- You need to avoid leaking whether an account exists.
- You need clean UX around resend, invalid codes, and timeouts.
- You need to handle channel failure gracefully (deliverability, carrier delays).
Most OTP failures aren’t crypto failures. They’re product failures: weak throttling, sloppy implementations, and a resend button that doubles as a brute-force API.
In a typical web app, auth answers: who is this?
In embedded wallets, auth also answers:
- who can recover a session,
- who can approve signing requests,
- and what your “identity perimeter” even is once you remove seed phrases from the user’s world.
OTP makes that perimeter usable. It’s familiar enough that users don’t bounce, and structured enough that you can build serious systems on top of it.