Zum Inhalt springen

@xid-kit/expo

Expo-SecureStore- und WebBrowser-Adapter für @xid-kit/react-native sowieein Expo-Router-Route-Guard-Hook.

Als Markdown anzeigen

Zustand

Paketstatus: Aktuelles Paket. Expo-SecureStore- undWebBrowser-Adapter, XidProvider und Expo-Router-Route-Guard-Hook sindimplementiert. Ein echter IdP-Round-Trip auf Produktionsinfrastruktursteht noch manuell aus.

Gesamte PKCE-Logik, Token-Tausch und Sitzungsverwaltung liegen in@xid-kit/react-native; dieses Paket stellt nur Adapter und dieExpo-Router-Integration bereit.

Anbieter-Einrichtung

Injizieren Sie createSecureStoreAdapter undcreateExpoWebBrowserAdapter in XidProvider. Es ist keinTop-Level-Expo-Modulimport erforderlich; Adapter akzeptierenModulinstanzen, damit der CI-Typecheck ohne installierte Expo-Peer-Depssauber bleibt.

import * as SecureStore from 'expo-secure-store'
import * as WebBrowser from 'expo-web-browser'
import { XidProvider, createSecureStoreAdapter, createExpoWebBrowserAdapter } from '@xid-kit/expo'

const tokenCache = createSecureStoreAdapter({ secureStore: SecureStore })
const browser = createExpoWebBrowserAdapter({ webBrowser: WebBrowser })

export default function App() {
  return (
    <XidProvider
      publishableKey="pk_live_..."
      issuer="https://xid.dev"
      clientId="your_client_id"
      redirectUri="myapp://auth/callback"
      tokenCache={tokenCache}
      browser={browser}
    >
      <RootLayout />
    </XidProvider>
  )
}

Anmelden und abmelden

import { useSignIn, useSignOut } from '@xid-kit/expo'
import { Button } from 'react-native'

function SignInScreen() {
  const { signIn, signInState } = useSignIn()
  return (
    <Button
      title={signInState.status === 'pending' ? 'Signing in...' : 'Sign In'}
      onPress={() => void signIn()}
    />
  )
}

function SignOutScreen() {
  const { signOut } = useSignOut()
  return <Button title="Sign Out" onPress={() => void signOut()} />
}

Expo-Router-Route-Guard

Rufen Sie useProtectedRoute in einer Layout-Komponente auf. Esliest isLoaded/isSignedIn aus useAuth und ruftreplace von Expo Router innerhalb eines useEffect auf.

import { useProtectedRoute } from '@xid-kit/expo'
import { useRouter, usePathname } from 'expo-router'

export default function RootLayout() {
  const router = useRouter()
  const pathname = usePathname()

  useProtectedRoute({
    signInRoute: '/sign-in',
    protectedRoute: '/(app)',
    pathname,
    replace: router.replace,
  })

  return <Slot />
}

SecureStore-Schlüssel-Namensgebung

Verwenden Sie keyPrefix, um Schlüssel unter einembenutzerdefinierten Prefix einzuordnen. Das Trennzeichen ist .(Punkt), das im erlaubten Zeichensatz von expo-secure-storeenthalten ist.

const tokenCache = createSecureStoreAdapter({
  secureStore: SecureStore,
  keyPrefix: 'myapp',
  // keys: 'myapp.xid.access_token', 'myapp.xid.refresh_token', etc.
})

Exportierte API

Exportieren Art Zweck
XidProvider Komponente Re-Export von @xid-kit/react-native XidProvider, der tokenCache undBrowser-Adapter akzeptiert
createSecureStoreAdapter function TokenCache-Adapter auf Basis von expo-secure-store; akzeptiertsecureStore-Instanz und optionales keyPrefix
createExpoWebBrowserAdapter function BrowserInterface-Adapter auf Basis von expo-web-browser
useSignIn Hook Re-Export aus @xid-kit/react-native: signIn, handleRedirect, signInState
useSignOut Hook Re-Export aus @xid-kit/react-native: signOut, signOutState
useProtectedRoute Hook Liest isLoaded/isSignedIn und ruft Expo Router replace für denRoutenschutz auf

Bekannte Einschränkungen

  • useAuth().isSignedIn spiegelt denXidClient-Web-Cookie-Sitzungsstatus wider, der nach demToken-Tausch nicht automatisch aus den lokalen SecureStore-Tokens befülltwird. Laden Sie den Client-Status nach einer erfolgreichen Anmeldungexplizit neu.
  • Dieses Paket stellt nur Adapter und die Expo-Router-Integration bereit.Für den grundlegenden React-Native-PKCE-Flow siehe@xid-kit/react-native.
Navigation

Suchbegriff eingeben...

Mit den Pfeiltasten navigierenEingabetaste zum AuswählenEscape zum Schließen