Skip to main content
Crossmint Auth is designed for staging and moving fast. For production applications, Crossmint strongly recommends connecting your own authentication provider for full control over user management. See the Bring Your Own Auth guide.
Crossmint Auth on React Native is headless — there is no pre-built login modal. You build your own UI and call the SDK hooks directly. This guide walks through both email OTP and OAuth login flows.

Before you start

Set up your project and get an API key.

Expo Wallets Quickstart

See a full working example with auth and wallets.
1

Install the SDK

Install the Crossmint React Native SDK and its required Expo peer dependencies:
The SDK requires the following Expo packages:
2

Configure your app scheme

OAuth redirects require a deep link scheme so the browser can return to your app after login.Add a scheme to your app.json (or app.config.ts):
app.json
Expo Go uses a different scheme at runtime (exp://127.0.0.1:8081). The SDK detects Expo Go automatically and adjusts the redirect URI, so OAuth works during development without extra configuration. For production builds, the scheme value above is used.
3

Add the Crossmint providers to your app

Wrap your application with CrossmintProvider and CrossmintAuthProvider.
providers.tsx
4

Build the login screen

Use the useCrossmintAuth hook to access auth functions. Unlike the React web SDK, there is no pre-built modal — you call loginWithOAuth and crossmintAuth.sendEmailOtp / crossmintAuth.confirmEmailOtp directly.

Email OTP Login

LoginScreen.tsx

OAuth Login (Google, Twitter)

OAuthButton.tsx
The SDK handles platform differences automatically:
  • iOS: Uses WebBrowser.openAuthSessionAsync, which opens an in-app authentication session (ASWebAuthenticationSession). The redirect URL is intercepted by the authentication session before it reaches your app’s URL routing, so Linking.useURL() remains null after the OAuth flow. There is no double invocation — createAuthSession is called only once by the SDK internally.
  • Android: Uses WebBrowser.openBrowserAsync, which opens the system browser. The OAuth provider redirects back to your app via the deep link scheme. You must listen for the incoming URL with Linking.useURL() and pass it to createAuthSession yourself, as shown in the example above.
The Linking.useURL() + createAuthSession pattern works on both platforms, so a single code path is sufficient.
5

Add logout and display user info

HomeScreen.tsx

Auth Status Values

The status field returned by useCrossmintAuth can be one of the following:

Token Storage

By default, the SDK stores authentication tokens using expo-secure-store, which encrypts data at rest using the platform keychain (iOS) or keystore (Android). This means tokens persist across app restarts and are protected by the device’s hardware-backed security. You can provide a custom storage implementation via the storageProvider prop on CrossmintAuthProvider if you need a different storage backend.

Differences from the React Web SDK

Moving to Production

Crossmint Auth is designed for staging and getting started quickly. For production applications, Crossmint strongly recommends migrating to your own authentication provider for full control over user management.
When you are ready to go to production, Crossmint recommends:
  1. Set up your own auth provider (Auth0, Firebase, Supabase, Stytch, etc.) and follow the Bring Your Own Auth guide to integrate it with Crossmint via JWT.
  2. Create a developer account on the production console.
  3. Create a production client API key on the API Keys page with the API scopes users.create, users.read, wallets.read.
  4. Configure JWT authentication for your auth provider in the Crossmint Console.

Next Steps