React Native OAuth Essentials is an essential OAuth solution for React Native apps. It provides up-to-date Google Sign-In, Apple Sign-In, and Password Sign-In, delivering a native sign-in experience with a simple, promise-based API. It's a must-have for every React Native app.
Install the library via npm:
npm install react-native-oauth-essentialsyarn add react-native-oauth-essentialsPlease jump to our docs website
This library provides native OAuth implementations with platform-specific behaviors and requirements:
iOS:
- Minimum: iOS 13+
- Uses native iOS Google Sign-In SDK
- Presents native iOS authentication UI
- No Google Play Services dependency
- Requires Google OAuth 2.0 Web Client ID from Google Cloud Console
- Supports One Tap sign-in experience
- Available:
GOOGLE_ID_SUPPORTEDconstant
Android:
- Minimum: Android 8.0+ (API 26+)
- Uses Credential Manager API with Google ID provider
- Requires Google Play Services to be installed and up-to-date
- Check
GOOGLE_PLAY_SERVICES_SUPPORTEDbefore using - Supports additional options:
authorizedAccountsandautoSelectEnabled - Presents native Android credential picker UI
- Requires Google OAuth 2.0 Web Client ID from Google Cloud Console
- Available:
GOOGLE_ID_SUPPORTEDconstant
Common Features:
- Returns standardized
GoogleIdCredentialResultwith user profile data - Includes ID token for backend verification
- User can cancel, returning
CancelledCredentialResult
iOS:
- Minimum: iOS 13+
- Uses native
AuthenticationServicesframework - Presents native Apple Sign-In UI sheet
- Full integration with iOS Keychain
- Returns
AppleIdCredentialResultwith:- ID token and authorization code
- User identifier (stable across app reinstalls)
- Email and full name (only on first sign-in)
- Real user indicator (
likelyReal)
- Caches email and fullName for subsequent sign-ins
- No additional configuration needed
- Available:
APPLE_ID_SUPPORTEDconstant
Android:
- Minimum: Android 8.0+ (API 26+)
- Uses browser-based OAuth flow via Chrome Custom Tabs (no native Apple Sign-In on Android)
- Opens device's default browser with your provided
androidWebUrl - Returns
WebAppleIdCredentialResultwith redirect URL components - Requires backend implementation to handle OAuth flow
- You must implement Apple Sign-In REST API on your server
- See Apple Sign-In REST API Documentation
- Available:
APPLE_ID_SUPPORTEDconstant
Implementation Note: iOS provides a complete native experience, while Android uses Chrome Custom Tabs to open your OAuth endpoint in the browser, then captures the redirect URL.
iOS:
- Minimum: iOS 12+
- Uses iOS Keychain Services
- Integrates with iCloud Keychain for sync across devices
- Presents native password autofill UI
- Supports AutoFill in WebViews
- Available:
PASSWORD_SUPPORTEDconstant
Android:
- Minimum: Android 7.0+ (API 24+)
- Uses Credential Manager API
- Integrates with Google Smart Lock for Passwords
- Can sync credentials across devices via Google account
- Presents native credential picker UI
- Supports autofill in WebViews and native forms
- Available:
PASSWORD_SUPPORTEDconstant
Common Features:
passwordSignIn()- Saves credentials securelygetPassword()- Retrieves stored credentials- Returns
PasswordCredentialResultwith username and password - Can be used alongside biometric authentication
- Returns
falseif no credentials stored
Purpose: Attempts all available sign-in methods simultaneously to find existing credentials.
iOS:
- Checks for: Apple ID, Google ID, and saved passwords
- Presents unified credential picker if multiple options available
- Returns first available credential
- Ideal for app launch to restore previous session
- Available:
HYBRID_SUPPORTEDconstant
Android:
- Checks for: Google ID and saved passwords (Apple requires web flow)
- Uses Credential Manager to aggregate all options
- Presents native Android credential picker
- Returns first selected credential
- Available:
HYBRID_SUPPORTEDconstant
Use Case: Perfect for "Continue with..." screens or automatic sign-in on app start.
Returns:
GoogleIdCredentialResultAppleIdCredentialResult(iOS only)PasswordCredentialResultCancelledCredentialResult
iOS:
- Uses
AuthenticationServicesframework (iOS 16+) - Supports WebAuthn/FIDO2 standard
- Syncs via iCloud Keychain
- Presents native passkey creation/selection UI
- Available:
PASSKEYS_SUPPORTEDconstant (iOS 16+)
Android:
- Uses Credential Manager API with passkey support (Android 9+ / API 28+)
- Supports WebAuthn/FIDO2 standard
- Syncs via Google Password Manager
- Additional options:
preferImmediatelyAvailableCredentials,isConditional - Available:
PASSKEYS_SUPPORTEDconstant
Common Features:
- Standards-based implementation (WebAuthn)
- Requires
requestJsonstring withPublicKeyCredentialCreationOptions - Returns
PassKeyCredentialResultwith platform public key credential - More secure than passwords (phishing-resistant)
- Biometric authentication integration
import {
googleSignIn,
appleSignIn,
passwordSignIn,
getPassword,
hybridSignIn,
createPassKey,
// Constants
GOOGLE_PLAY_SERVICES_SUPPORTED,
PASSWORD_SUPPORTED,
GOOGLE_ID_SUPPORTED,
APPLE_ID_SUPPORTED,
HYBRID_SUPPORTED,
PASSKEYS_SUPPORTED,
// Types
type GoogleSignInOptions,
type PasskeyOptions,
type GoogleIdCredentialResult,
type AppleIdCredentialResult,
type WebAppleIdCredentialResult,
type PasswordCredentialResult,
type PassKeyCredentialResult,
type CancelledCredentialResult,
CredentialsType,
CredentialError,
} from 'react-native-oauth-essentials';Check platform support before using OAuth methods:
| Constant | Type | Description |
|---|---|---|
GOOGLE_PLAY_SERVICES_SUPPORTED |
boolean |
Google Play Services are available. Always false on iOS. |
PASSWORD_SUPPORTED |
boolean |
Password credential manager is supported on this device. |
GOOGLE_ID_SUPPORTED |
boolean |
Google Sign-In is supported. Use this to check if you can use googleSignIn(). |
APPLE_ID_SUPPORTED |
boolean |
Apple Sign-In is supported on this device. |
HYBRID_SUPPORTED |
boolean |
Hybrid sign-in is supported (multiple methods at once). |
PASSKEYS_SUPPORTED |
boolean |
Passkeys are supported on this device. |
Example:
if (GOOGLE_ID_SUPPORTED) {
await googleSignIn('YOUR_WEB_CLIENT_ID');
}Performs Google Sign-In with native UI.
Parameters:
webClientId(string): Your Google OAuth 2.0 web client IDoptions(GoogleSignInOptions, optional): Sign-in configuration
Returns: Promise<GoogleIdCredentialResult | CancelledCredentialResult>
Platform: Android, iOS (check GOOGLE_ID_SUPPORTED)
Example:
const result = await googleSignIn('YOUR_WEB_CLIENT_ID', {
authorizedAccounts: true, // Android only
autoSelectEnabled: false, // Android only
});
if (result.type === CredentialsType.GOOGLE_ID) {
console.log('User ID:', result.data.id);
console.log('ID Token:', result.data.idToken);
console.log('Name:', result.data.displayName);
}Initiates Apple Sign-In process.
Parameters:
androidWebUrl(string, optional): Web URL for Android OAuth flow. Required on Android.
Returns: Promise<AppleIdCredentialResult | WebAppleIdCredentialResult>
Platform:
- iOS: Native Apple Sign-In UI
- Android: Opens browser with your web URL for OAuth flow
Platform: Check APPLE_ID_SUPPORTED
Example:
const result = await appleSignIn('https://yourserver.com/apple-signin');
if (result.type === CredentialsType.APPLE_ID) {
// iOS result
console.log('User:', result.data.user);
console.log('ID Token:', result.data.idToken);
console.log('Email:', result.data.email);
} else if (result.type === CredentialsType.WEB_APPLE_ID) {
// Android result
console.log('Redirect URL:', result.data.url);
}Saves username/password credentials to the platform's credential manager.
Parameters:
username(string): Username to savepassword(string): Password to save
Returns: Promise<boolean>
Platform: Android, iOS (check PASSWORD_SUPPORTED)
Example:
const saved = await passwordSignIn('user@example.com', 'password123');
console.log('Credentials saved:', saved);Retrieves stored password credentials.
Returns: Promise<false | PasswordCredentialResult>
Platform: Android, iOS (check PASSWORD_SUPPORTED)
Example:
const result = await getPassword();
if (result && result.type === CredentialsType.PASSWORD) {
console.log('Username:', result.data.username);
console.log('Password:', result.data.password);
} else {
console.log('No stored password found');
}Attempts all available sign-in methods at once. Useful on app start to check for existing credentials.
Parameters:
googleClientId(string): Your Google OAuth 2.0 web client IDoptions(GoogleSignInOptions, optional): Google sign-in configuration
Returns: Promise<AppleIdCredentialResult | GoogleIdCredentialResult | PasswordCredentialResult | CancelledCredentialResult>
Platform: Android, iOS (check HYBRID_SUPPORTED)
Example:
const result = await hybridSignIn('YOUR_WEB_CLIENT_ID');
switch (result.type) {
case CredentialsType.GOOGLE_ID:
console.log('Google user:', result.data.displayName);
break;
case CredentialsType.APPLE_ID:
console.log('Apple user:', result.data.user);
break;
case CredentialsType.PASSWORD:
console.log('Username:', result.data.username);
break;
case CredentialsType.CANCELLED:
console.log('User cancelled');
break;
}Creates a new passkey credential.
Parameters:
options(PasskeyOptions): Passkey creation configuration
Returns: Promise<PassKeyCredentialResult>
Platform: Check PASSKEYS_SUPPORTED
Example:
const result = await createPassKey({
requestJson: JSON.stringify({ /* PublicKeyCredentialCreationOptions */ }),
preferImmediatelyAvailableCredentials: true, // Android only
isConditional: false, // Android only
});
if (result.type === CredentialsType.PASSKEY) {
console.log('Passkey created:', result.data);
}type GoogleSignInOptions = {
authorizedAccounts?: boolean; // Android only: Filter to authorized accounts
autoSelectEnabled?: boolean; // Android only: Enable auto-selection
};type PasskeyOptions = {
requestJson: string; // JSON string of PublicKeyCredentialCreationOptions
preferImmediatelyAvailableCredentials?: boolean; // Android only
isConditional?: boolean; // Android only
};type GoogleIdCredentialResult = {
type: CredentialsType.GOOGLE_ID;
data: {
id: string; // User's Google ID
idToken: string; // JWT ID token
displayName: string; // Full name
givenName: string; // First name
familyName: string; // Last name
profilePictureUri?: string | null; // Profile picture URL
phoneNumber?: string | null; // Phone number (if available)
};
};type AppleIdCredentialResult = {
type: CredentialsType.APPLE_ID;
data: {
idToken: string; // JWT ID token
authorizationCode: string; // Authorization code
user: string; // Unique user identifier
email: string; // User's email
fullName: string; // Full name
likelyReal: boolean; // Indicates if user is likely real
};
};Android-specific result when using web-based Apple Sign-In:
type WebAppleIdCredentialResult = {
type: CredentialsType.WEB_APPLE_ID;
data: {
url: string; // Full redirect URL
scheme: string | null; // URL scheme
host: string | null; // URL host
path: string | null; // URL path
query: string | null; // URL query parameters
};
};type PasswordCredentialResult = {
type: CredentialsType.PASSWORD;
data: {
username: string; // Stored username
password: string; // Stored password
};
};type PassKeyCredentialResult = {
type: CredentialsType.PASSKEY;
data: string; // JSON string of platform public key credential
};type CancelledCredentialResult = {
type: CredentialsType.CANCELLED;
data: null; // User cancelled the operation
};enum CredentialsType {
GOOGLE_ID = 'GOOGLE_ID', // Google Sign-In credential
PASSWORD = 'PASSWORD', // Username/password credential
APPLE_ID = 'APPLE_ID', // iOS native Apple Sign-In credential
WEB_APPLE_ID = 'WEB_APPLE_ID', // Android web-based Apple Sign-In credential
CANCELLED = 'CANCELLED', // User cancelled the sign-in flow
PASSKEY = 'PASSKEY', // Passkey credential
}enum CredentialError {
NO_PLAY_SERVICES_ERROR = 'NO_PLAY_SERVICES_ERROR', // Google Play Services unavailable
NO_ACTIVITY_ERROR = 'NO_ACTIVITY_ERROR', // No Android activity available
INVALID_RESULT_ERROR = 'INVALID_RESULT_ERROR', // Invalid result from native module
}Error Handling:
try {
const result = await googleSignIn('YOUR_WEB_CLIENT_ID');
} catch (error) {
if (error.code === CredentialError.NO_PLAY_SERVICES_ERROR) {
console.error('Google Play Services not available');
}
}I’ve always felt that React Native lacked a single library that handles OAuth end-to-end. Most React Native apps end up downloading multiple libraries just to implement OAuth features. Each library feels different—they follow different philosophies, have different implementations, and some are outdated.
Coming from native development, I wanted a library that provides all the OAuth features an app actually needs. That’s why I created and launched it as “Essentials.” One big reason is that if you include Google OAuth in your app, Apple’s App Store policies require you to provide Apple OAuth as well, or your app won’t be approved.
I was frustrated going through this process myself, and seeing how much time React Native developers spent trying to deliver a “good enough” sign-in experience. So I thought—why not create one library that actually behaves and doesn’t make me want to throw my laptop out the window?
Free forever, up-to-date features, and focused only on the essentials your mobile app really needs.