Modèles Expo
SDK : @clerk/expo v3+. Nécessite Expo 53+, React Native 0.73+.
De Quoi Avez-Vous Besoin ?
| Tâche | Référence |
|---|---|
| Persister les tokens avec SecureStore | references/token-storage.md |
| OAuth (Google, Apple, GitHub) | references/oauth-deep-linking.md |
| Écrans protégés avec Expo Router | references/protected-routes.md |
| Notifications push avec données utilisateur | references/push-notifications.md |
Modèle Mental
Clerk stocke le token de session en mémoire par défaut. Dans les applications natives :
- SecureStore — chiffre le token dans le trousseau du dispositif (recommandé pour la production)
tokenCache— prop sur<ClerkProvider>qui fournit un stockage personnaliséuseAuth— même API que le web, fonctionne dans n'importe quel composant- OAuth — nécessite
useSSO+ schéma de deep link configuré dansapp.json
Configuration Minimale
app/_layout.tsx
import { ClerkProvider } from '@clerk/expo'
import { tokenCache } from '@clerk/expo/token-cache'
import { Stack } from 'expo-router'
const publishableKey = process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY!
export default function RootLayout() {
return (
<ClerkProvider publishableKey={publishableKey} tokenCache={tokenCache}>
<Stack />
</ClerkProvider>
)
}
CRITIQUE : Utilisez
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY— pasNEXT_PUBLIC_. Les variables d'environnement à l'intérieur denode_modulesne sont pas inlined dans les builds de production. Passez toujourspublishableKeyexplicitement.
Cache de Token Intégré
import { tokenCache } from '@clerk/expo/token-cache'
Ceci utilise expo-secure-store avec keychainAccessible: AFTER_FIRST_UNLOCK. Installez la dépendance peer :
npx expo install expo-secure-store
Hooks d'Authentification
import { useAuth, useUser, useSignIn, useSignUp, useClerk } from '@clerk/expo'
export function ProfileScreen() {
const { isSignedIn, userId, signOut } = useAuth()
const { user } = useUser()
if (!isSignedIn) return <Redirect href="/sign-in" />
return (
<View>
<Text>{user?.fullName}</Text>
<Button title="Sign Out" onPress={() => signOut()} />
</View>
)
}
Flux OAuth (Google)
import { useSSO } from '@clerk/expo'
import * as WebBrowser from 'expo-web-browser'
WebBrowser.maybeCompleteAuthSession()
export function GoogleSignIn() {
const { startSSOFlow } = useSSO()
const handlePress = async () => {
try {
const { createdSessionId, setActive } = await startSSOFlow({
strategy: 'oauth_google',
redirectUrl: 'myapp://oauth-callback',
})
if (createdSessionId) await setActive!({ session: createdSessionId })
} catch (err) {
console.error(err)
}
}
return <Button title="Continue with Google" onPress={handlePress} />
}
Changement d'Organisation
import { useOrganization, useOrganizationList } from '@clerk/expo'
export function OrgSwitcher() {
const { organization } = useOrganization()
const { setActive, userMemberships } = useOrganizationList()
return (
<View>
<Text>Actuelle : {organization?.name ?? 'Personnel'}</Text>
{userMemberships.data?.map(mem => (
<Button
key={mem.organization.id}
title={mem.organization.name}
onPress={() => setActive({ organization: mem.organization.id })}
/>
))}
</View>
)
}
Pièges Courants
| Symptôme | Cause | Solution |
|---|---|---|
publishableKey indéfini en prod |
Utilisation de variable d'environnement sans EXPO_PUBLIC_ |
Renommez en EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY |
| Token perdu au redémarrage de l'app | Pas de tokenCache |
Passez tokenCache depuis @clerk/expo/token-cache |
| Redirection OAuth ne fonctionne pas | Schéma manquant dans app.json |
Ajoutez "scheme": "myapp" à app.json |
WebBrowser.maybeCompleteAuthSession |
Non appelé | Appelez-le au niveau supérieur de l'écran de callback OAuth |
useSSO non trouvé |
Ancienne version de @clerk/expo |
useSSO a remplacé useOAuth en v3+ |
Carte d'Imports
| Quoi | Import Depuis |
|---|---|
ClerkProvider |
@clerk/expo |
tokenCache |
@clerk/expo/token-cache |
useAuth, useUser, useSignIn |
@clerk/expo |
useSSO |
@clerk/expo |
useOrganization, useOrganizationList |
@clerk/expo |
Voir Aussi
clerk-setup- Installation initiale de Clerkclerk-custom-ui- Flux personnalisés & apparenceclerk-orgs- Organisations B2B