Expo Integration
Expo is a popular framework for building cross-platform apps with React Native. Better Auth supports both Expo native and web apps.
Installation
Configure A Better Auth Backend
Before using Better Auth with Expo, make sure you have a Better Auth backend set up. You can either use a separate server or leverage Expo's new API Routes feature to host your Better Auth instance.
To get started, check out our installation guide for setting up Better Auth on your server. If you prefer to check out the full example, you can find it here.
To use the new API routes feature in Expo to host your Better Auth instance you can create a new API route in your Expo app and mount the Better Auth handler.
Install Better Auth and Expo Plugin
Install both the expo plugin in your server and both the Better Auth package and the Expo plugin in your Expo app.
Add the Expo Plugin on Your Server
Add the Expo plugin to your Better Auth server.
Initialize Better Auth Client
To initialize Better Auth in your Expo app, you need to call createAuthClient
with the base url of your Better Auth backend. Make sure to import the client from /react
.
You need to also import client plugin from @better-auth/expo/client
and pass it to the plugins
array when initializing the auth client.
This is important because:
- Social Authentication Support: enables social auth flows by handling authorization URLs and callbacks within the Expo web browser.
- Secure Cookie Management: stores cookies securely and automatically adds them to the headers of your auth requests.
Be sure to include the full URL, including the path, if you've changed the default path from /api/auth
.
Scheme and Trusted Origins
Better Auth uses deep links to redirect users back to your app after authentication. To enable this, you need to add your app's scheme to the trustedOrigins
list in your Better Auth config.
First, make sure you have a scheme defined in your app.json
file.
Then, update your Better Auth config to include the scheme in the trustedOrigins
list.
Configure Metro Bundler
To resolve better auth exports you'll need to enable unstable_enablePackageExports
in your metro config.
If you can't enable unstable_enablePackageExports
option, you can use babel-plugin-module-resolver to manually resolve the paths.
Don't forget to clear the cache after making changes.
Usage
Authenticating Users
With Better Auth initialized, you can now use the authClient
to authenticate users in your Expo app.
For social sign-in, you can use the authClient.signIn.social
method with the provider name and a callback URL.
Session
Better Auth provides a useSession
hook to access the current user's session in your app.
On native, the session data will be cached in SecureStore. This will allow you to remove the need for a loading spinner when the app is reloaded. You can disable this behavior by passing the disableCache
option to the client.
Making Authenticated Requests to Your Server
To make authenticated requests to your server that require the user's session, you have two options:
- Use the fetch client provided by Better Auth.
- Retrieve the session cookie from
SecureStore
and manually add it to your request headers.
Option 1: Using the Fetch Client
Better Auth provides a built-in fetch client powered by Better Fetch. This client automatically includes the session cookie in the headers of your requests.
For more details, see the Better Fetch documentation.
Option 2: Adding the Cookie to Request Headers
If you prefer using your own fetch client, you can retrieve the session cookie stored in the device using authClient.getCookie
and manually add it to your request headers.
Example: Usage With TRPC
Options
Expo Client
storage: the storage mechanism used to cache the session data and cookies.
scheme: scheme is used to deep link back to your app after a user has authenticated using oAuth providers. By default, Better Auth tries to read the scheme from the app.json
file. If you need to override this, you can pass the scheme option to the client.
disableCache: By default, the client will cache the session data in SecureStore. You can disable this behavior by passing the disableCache
option to the client.
Expo Servers
Server plugin options:
overrideOrigin: Override the origin for expo API routes (default: false). Enable this if you're facing cors origin issues with expo API routes.