Aller au contenu

@xid-kit/react-native

Fournisseur et hooks React Native pour la redirection Hosted Auth, PKCES256, le callback deeplink et les adaptateurs de stockage sécurisé desjetons.

Afficher en Markdown

Statut

Le statut du package est Package actuel. Il implémente le contratnatif partagé : redirection Hosted Auth avec PKCE S256, validation d’étatCSRF sur le callback deeplink, échange de code d’autorisation contre lepoint de terminaison de jeton et persistance sécurisée des jetons via unadaptateur de stockage injecté.

Un aller-retour réel avec un IdP sur une infrastructure de production esten attente de vérification manuelle. Cette page documente le comportementimplémenté ; ce n’est pas une affirmation de disponibilité en production.

Configuration du fournisseur

Injectez un TokenCache (stockage sécurisé de la plateforme) et unBrowserInterface (navigateur in-app) dans XidProvider. LeSDK ne lie pas en dur de module natif ; les applications Expo peuventutiliser les adaptateurs prêts à l’emploi de @xid-kit/expo.

import { XidProvider } from '@xid-kit/react-native'
import type { BrowserInterface, TokenCache } from '@xid-kit/react-native'
import * as Keychain from 'react-native-keychain'

const tokenCache: TokenCache = {
  async getToken(key) {
    const result = await Keychain.getGenericPassword({ service: key })
    return result ? result.password : null
  },
  async saveToken(key, value) {
    await Keychain.setGenericPassword('xid', value, { service: key })
  },
  async deleteToken(key) {
    await Keychain.resetGenericPassword({ service: key })
  },
}

const browser: BrowserInterface = {
  async openAuthSession(url, redirectUri) {
    // Open url with your in-app browser library, wait for the redirectUri
    // deep link, then return { type: 'success', url } or { type: 'cancel' }.
    throw new Error('Implement with your preferred in-app browser library.')
  },
}

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

Se connecter

signIn() construit l’URL d’autorisation PKCE S256, stocke levérificateur et l’état OAuth dans le cache de jetons, ouvre l’adaptateurnavigateur et échange le code retourné contre des jetons. Les échecs dunavigateur, les incohérences d’état CSRF et les erreurs d’échange dejetons remontent sous forme de signInState.status === 'error'.

import { useSignIn } from '@xid-kit/react-native'

function SignInScreen() {
  const { signIn, signInState } = useSignIn()

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

Lorsque l’adaptateur navigateur ne peut pas capturer la redirectionlui-même, enregistrez le schéma d’URI de redirection dans le manifeste devotre application et transmettez le deep link àhandleRedirect(url). Il valide l’état OAuth, échange le code etstocke l’ensemble de jetons.

import { useSignIn } from '@xid-kit/react-native'
import { useEffect } from 'react'
import { Linking } from 'react-native'

function DeepLinkHandler() {
  const { handleRedirect } = useSignIn()

  useEffect(() => {
    const sub = Linking.addEventListener('url', ({ url }) => {
      if (url.startsWith('myapp://auth/callback')) {
        void handleRedirect(url)
      }
    })
    return () => sub.remove()
  }, [handleRedirect])

  return null
}

API exportée

Exporter Type Objectif
XidProvider composant Encapsule le fournisseur @xid-kit/react et injecte tokenCache, browser,issuer, clientId, redirectUri et scopes
useSignIn hook signIn(options?) exécute le flux de redirection complet ;handleRedirect(url) traite un callback deeplink ; signInState rapporteidle, pending, complete, cancelled ou error
useSignOut hook signOut() efface l’ensemble de jetons local, puis révoque la sessionserveur via useAuth().signOut ; signOutState rapporte la progression
useXidRnContext hook Contexte d’adaptateur brut (usage avancé et tests)
exchangeCodeForTokens function POST de bas niveau vers le point de terminaison de jeton avec grant_typeauthorization_code et le vérificateur PKCE ; retourne un TokenSet
saveTokenSet / clearTokenSet fonctions Persister ou supprimer l’ensemble de jetons dans l’adaptateur TokenCache
TOKEN_KEYS objet as const Noms des clés TokenCache pour les jetons d’accès, d’actualisation et d’ID,plus le vérificateur PKCE et l’état OAuth
createPkceVerifier / createPkceChallenge fonctions Utilitaires PKCE S256 délégués à @xid-kit/protocol (Web Crypto)
createRandomString / base64UrlEncode fonctions Chaîne aléatoire sûre pour les URL pour l’état OAuth ; assistantd’encodage base64url

Ré-exports de @xid-kit/react

Les hooks de session et les composants de contrôle sont ré-exportés sansmodification depuis @xid-kit/react : useAuth,useUser, useSession, useSessionList,useOrganization, useOrganizationList, useAPIKeys,SignedIn, SignedOut, Protect, XidLoaded,XidLoading, XidFailed et XidDegraded.

Types

Type Description
XidProviderProps Props du fournisseur @xid-kit/react plus tokenCache, browser, issuer,clientId, redirectUri et portées optionnelles (par défaut openid, profile,email)
TokenCache Contrat de l’adaptateur de stockage : getToken, saveToken, deleteToken(tous asynchrones)
BrowserInterface openAuthSession(url, redirectUri) se résolvant en un BrowserResult
BrowserResult Union de succès (avec URL de callback), annulation et fermeture
SignInOptions Surcharges par appel pour signIn : redirectUri, scopes
SignInState / SignOutState Unions de statuts discriminantes retournées par les hooks
UseSignInReturn / UseSignOutReturn Formes de retour des hooks : actions et état
TokenExchangeInput / TokenSet Entrée et résultat de exchangeCodeForTokens : accessToken, refreshToken,idToken, expiresIn
XidRnContextValue Forme du contexte d’adaptateur retournée par useXidRnContext

Limites connues

  • Pas de rafraîchissement automatique de session à l’expiration du jeton ;le jeton d’actualisation stocké est disponible pour un renouvellement gérépar l’application.
  • useAuth().isSignedIn reflète la session cookie XidClient, pas le contenudu TokenCache. Rechargez l’état du client après un échange de jetonsréussi pour maintenir l’état d’authentification en direct.
  • Le contexte d’organisation n’est pas encore alimenté depuis les jetonsstockés.

Sécurité

  • Code d’autorisation avec PKCE S256 uniquement. Pas de flux implicite ni de password grant.
  • Les clients publics ne stockent jamais de secrets client.
  • Le vérificateur PKCE et l’état OAuth résident dans l’adaptateur destockage sécurisé injecté et sont supprimés après l’échange de code.
  • signOut efface l’ensemble de jetons local et révoque la session serveur ;les échecs remontent dans signOutState au lieu d’être ignorés.
Navigation

Saisissez votre recherche...

Utilisez les touches fléchées pour naviguerAppuyez sur Entrée pour sélectionnerAppuyez sur Échap pour fermer