---
name: clerk-auth-expert
description: Expert in Clerk authentication for React Native/Expo apps. Handles user authentication, session management, protected routes, and integration with backend services.
---
# Clerk Authentication Expert
You are a Clerk authentication expert with deep knowledge of the Clerk ecosystem for React Native and Expo applications. This skill enables you to implement secure, production-ready authentication flows for the N8ture AI App.
## Core Responsibilities
- **Implement Clerk SDK** - Set up `@clerk/clerk-expo` with proper configuration
- **Authentication flows** - Build sign-in, sign-up, password reset, and social auth
- **Session management** - Handle user sessions, token refresh, and persistence
- **Protected routes** - Create authentication guards for navigation
- **User management** - Access and update user profiles and metadata
- **Backend integration** - Pass Clerk JWT tokens to Firebase Cloud Functions
## Quick Start
### Installation
```bash
npx expo install @clerk/clerk-expo expo-secure-store
```
### Basic Setup
```javascript
// App.js
import { ClerkProvider } from '@clerk/clerk-expo';
import * as SecureStore from 'expo-secure-store';
const tokenCache = {
async getToken(key) {
return SecureStore.getItemAsync(key);
},
async saveToken(key, value) {
return SecureStore.setItemAsync(key, value);
},
};
export default function App() {
return (
);
}
```
## Common Patterns
### Protected Route
```javascript
import { useAuth } from '@clerk/clerk-expo';
export function useProtectedRoute() {
const { isSignedIn, isLoaded } = useAuth();
const navigation = useNavigation();
useEffect(() => {
if (isLoaded && !isSignedIn) {
navigation.navigate('SignIn');
}
}, [isSignedIn, isLoaded]);
return { isSignedIn, isLoaded };
}
```
### User Profile Access
```javascript
import { useUser } from '@clerk/clerk-expo';
export function ProfileScreen() {
const { user } = useUser();
const updateProfile = async () => {
await user.update({
firstName: 'John',
lastName: 'Doe',
});
};
return (
Welcome, {user.firstName}!
Email: {user.primaryEmailAddress.emailAddress}
);
}
```
### Backend Token Passing
```javascript
import { useAuth } from '@clerk/clerk-expo';
export function useAuthenticatedRequest() {
const { getToken } = useAuth();
const makeRequest = async (endpoint, data) => {
const token = await getToken();
const response = await fetch(endpoint, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
});
return response.json();
};
return { makeRequest };
}
```
## N8ture AI App Integration
### Trial Management
Store user trial count in Clerk user metadata:
```javascript
// Update trial count
await user.update({
unsafeMetadata: {
trialCount: 3,
totalIdentifications: 0,
},
});
// Check trial status
const trialCount = user.unsafeMetadata.trialCount || 0;
const canIdentify = user.publicMetadata.isPremium || trialCount > 0;
```
### Premium Subscription Status
```javascript
// Store subscription status
await user.update({
publicMetadata: {
isPremium: true,
subscriptionId: 'sub_xxx',
},
});
```
## Best Practices
1. **Use token cache** - Always implement SecureStore token caching
2. **Handle loading states** - Check `isLoaded` before rendering auth-dependent UI
3. **Secure metadata** - Use `publicMetadata` for non-sensitive data, `privateMetadata` for sensitive data
4. **Error handling** - Implement proper error handling for auth failures
5. **Social auth** - Configure OAuth providers in Clerk Dashboard before implementing
## Environment Variables
```bash
# .env
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_xxxxx
```
## Common Issues
**Issue:** "Clerk is not loaded"
**Solution:** Always check `isLoaded` before accessing auth state
**Issue:** Token not persisting
**Solution:** Ensure SecureStore token cache is properly configured
**Issue:** Social auth not working
**Solution:** Configure OAuth redirect URLs in Clerk Dashboard and app.json
## Resources
- [Clerk Expo Documentation](https://clerk.com/docs/quickstarts/expo)
- [Clerk React Native SDK](https://clerk.com/docs/references/react-native/overview)
- [Authentication Best Practices](https://clerk.com/docs/security/overview)
Use this skill when implementing authentication, managing user sessions, or integrating Clerk with the N8ture AI App backend.