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

Statut du registre : UNPUBLISHED. Installez ce SDK uniquement depuis un checkout du code source du dépôt ; n’utilisez pas de registre de paquets externe.

L’état du package est Package actuel. Il implémente un contrat natif de session par jeton: redirection Hosted Auth avec PKCE S256, validation de l’état et du nonce lors du callback deep link, claims vérifiés du jeton d’identité, échange du code d’autorisation et persistance sécurisée de la session via un adaptateur 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
      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 le vérificateur, l’état OAuth et le nonce dans le cache de jetons, ouvre l’adaptateur de navigateur et échange le code retourné contre une session native vérifiée. Les échecs du navigateur, les incohérences d’état, les erreurs de vérification du jeton d’identité et d’échange de jetons sont exposés via 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 de navigateur ne peut pas capturer lui-même la redirection, enregistrez le schéma URI de redirection dans le manifeste de votre application et transférez le deep link à handleRedirect(url). Il valide et consomme l’état OAuth, le vérificateur et le nonce, échange le code, vérifie le jeton d’identité et stocke la session native.

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 Fournit un contexte natif de session par jeton utilisant tokenCache, browser, issuer, clientId, redirectUri, scopes et un fetcher facultatif
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 la session locale et les identifiants hérités; signOutState signale la progression ou les échecs de stockage; aucune requête de révocation n’est envoyée
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 de clés TokenCache pour l’enveloppe de session actuelle et les enregistrements PKCE, d’état et de nonce en attente; les clés de jetons héritées servent uniquement au nettoyage
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

Hooks et contrôles natifs

Contrairement à @xid-kit/react, ce package utilise son propre contexte natif de jetons. Il exporte useAuth, useUser, useSession, useSignIn, useSignOut, useXidRnContext, SignedIn, SignedOut, XidLoaded, XidLoading, exchangeCodeForTokens, saveTokenSet, readTokenSet et clearTokenSet; il n’importe ni ne réexporte le SDK web React.

Types

Type Description
XidProviderProps Props du provider natif: children, tokenCache, browser, issuer, clientId, redirectUri, scopes facultatifs (par défaut openid, profile, email) et fetcher facultatif
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, idToken, expiresIn et claims vérifiés du jeton d’identité
XidRnContextValue Forme du contexte d’adaptateur retournée par useXidRnContext

Limites connues

  • Le SDK ne possède aucune liaison d’expéditeur DPoP, rejette offline_access et exige un nouveau flux d’autorisation après l’expiration du jeton d’accès.
  • useAuth().isSignedIn reflète une session stockée localement uniquement après la vérification du jeton d’identité; il ne lit pas une session de cookie web.
  • 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 la session locale et les identifiants hérités sans requête de renouvellement ni de révocation; les échecs de stockage sont exposés dans signOutState.
Navigation

Saisissez votre recherche...

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