Send users to a login page MojoAuth hosts and you brand. Zero UI to build.
MojoAuth documentation
Welcome to MojoAuth
Welcome to MojoAuth — passwordless authentication made simple for modern developers.
import OIDCProvider from "next-auth/providers/openid-connect"
export const authOptions = { providers: [ OIDCProvider({ id: "mojoauth", clientId: process.env.MOJOAUTH_CLIENT_ID, clientSecret: process.env.MOJOAUTH_CLIENT_SECRET, issuer: process.env.MOJOAUTH_ISSUER, checks: ["pkce", "state"], }), ],}const issuer = await Issuer.discover(process.env.MOJOAUTH_ISSUER)const client = new issuer.Client({ client_id: process.env.MOJOAUTH_CLIENT_ID, client_secret: process.env.MOJOAUTH_CLIENT_SECRET, redirect_uris: [process.env.MOJOAUTH_REDIRECT_URI],})
app.get("/login", (req, res) => { res.redirect(client.authorizationUrl({ scope: "openid profile email", state }))})import { UserManager } from "oidc-client-ts"
const userManager = new UserManager({ authority: process.env.REACT_APP_MOJOAUTH_AUTHORITY, client_id: process.env.REACT_APP_MOJOAUTH_CLIENT_ID, redirect_uri: process.env.REACT_APP_REDIRECT_URI, response_type: "code", scope: "openid profile email",})
export const login = () => userManager.signinRedirect()curl -X POST https://api.mojoauth.com/users/emailotp \ -H "x-api-key: $MOJOAUTH_API_KEY" \ -H "Content-Type: application/json" \ -d '{"email": "ada@example.com"}'
# { "state_id": "state_xyz789", "status": "success" }Start here
Pick how your app signs users in
Four ways in. Each one ends the same way: a verified user and tokens your app trusts.
Hosted Login Page
Single-page app
Authorization Code + PKCE from the browser. No secret ships to the client.
Mobile app
Native sign-in with the system browser, biometrics and secure token storage.
Sign-in methods
Every method, one integration
Turn methods on in the dashboard. Your code doesn't change: the same OIDC flow returns the same tokens.
Integrations
Plugs into the stack you already run
Go deeper
© 2026 MojoAuthmojoauth.comStatusSupportPrivacy