Saltar al contenido

@xid-kit/react-native

Provider y hooks de React Native para redirección a Hosted Auth, PKCE S256, callback de deep link y adaptadores de almacenamiento seguro de tokens.

Ver como Markdown

Estado

Estado del registro: UNPUBLISHED. Instala este SDK únicamente desde el checkout del código fuente del repositorio; no uses un registro de paquetes externo.

El estado del paquete es Paquete actual. Implementa un contrato nativo de sesión de tokens: redirección de Hosted Auth con PKCE S256, validación de estado y nonce en el callback del enlace profundo, claims verificadas del token de ID, intercambio del código de autorización y persistencia segura de la sesión mediante un adaptador de almacenamiento inyectado.

Una prueba de ida y vuelta real contra un IdP en infraestructura de producción está pendiente de verificación manual. Esta página documenta el comportamiento implementado; no es una declaración de disponibilidad para producción.

Configuración del proveedor

Inyecta un TokenCache (almacenamiento seguro de la plataforma) y un BrowserInterface (navegador en app) en XidProvider. El SDK no vincula ningún módulo nativo de forma rígida; las apps Expo pueden usar los adaptadores listos 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>
  )
}

Iniciar sesión

signIn() crea la URL de autorización PKCE S256, almacena el verificador, el estado de OAuth y el nonce en la caché de tokens, abre el adaptador del navegador e intercambia el código devuelto por una sesión nativa verificada. Los fallos del navegador, las discrepancias de estado y los errores de verificación del token de ID o de intercambio de tokens se muestran como 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()}
    />
  )
}

Cuando el adaptador del navegador no pueda capturar por sí mismo la redirección, registre el esquema de URI de redirección en el manifiesto de la aplicación y reenvíe el enlace profundo a handleRedirect(url). La función valida y consume el estado de OAuth, el verificador y el nonce, intercambia el código, verifica el token de ID y almacena la sesión nativa.

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 exportada

Exportar Tipo Propósito
XidProvider componente Proporciona un contexto nativo de sesión de tokens mediante tokenCache, browser, issuer, clientId, redirectUri, scopes y un fetcher opcional
useSignIn hook signIn(options?) ejecuta el flujo de redirección completo; handleRedirect(url) procesa un callback de deep link; signInState reporta idle, pending, complete, cancelled o error
useSignOut hook signOut() borra la sesión local y las credenciales heredadas; signOutState informa del progreso o de fallos de almacenamiento; no se envía ninguna solicitud de revocación
useXidRnContext hook Contexto del adaptador sin procesar (uso avanzado y pruebas)
exchangeCodeForTokens function POST de bajo nivel al endpoint de tokens con grant_type authorization_code y el verificador PKCE; devuelve un TokenSet
saveTokenSet / clearTokenSet funciones Persiste o elimina el conjunto de tokens en el adaptador TokenCache
TOKEN_KEYS objeto as const Nombres de claves de TokenCache para el sobre de sesión actual y los registros pendientes de PKCE, estado y nonce; las claves de tokens heredadas solo se usan para limpieza
createPkceVerifier / createPkceChallenge funciones Utilidades PKCE S256 delegadas a @xid-kit/protocol (Web Crypto)
createRandomString / base64UrlEncode funciones Cadena aleatoria segura para URLs como estado OAuth; utilidad de codificación base64url

Hooks y controles nativos

A diferencia de @xid-kit/react, este paquete usa su propio contexto nativo de tokens. Exporta useAuth, useUser, useSession, useSignIn, useSignOut, useXidRnContext, SignedIn, SignedOut, XidLoaded, XidLoading, exchangeCodeForTokens, saveTokenSet, readTokenSet y clearTokenSet; no importa ni vuelve a exportar el SDK web de React.

Tipos

Tipo Descripción
XidProviderProps Props del proveedor nativo: children, tokenCache, browser, issuer, clientId, redirectUri, scopes opcionales (openid, profile y email de forma predeterminada) y fetcher opcional
TokenCache Contrato del adaptador de almacenamiento: getToken, saveToken, deleteToken (todos asíncronos)
BrowserInterface openAuthSession(url, redirectUri) que resuelve a un BrowserResult
BrowserResult Unión de éxito (con URL de callback), cancelación y cierre
SignInOptions Anulaciones por llamada para signIn: redirectUri, scopes
SignInState / SignOutState Uniones discriminadas de estado devueltas por los hooks
UseSignInReturn / UseSignOutReturn Formas de retorno del hook: acciones más estado
TokenExchangeInput / TokenSet Entrada y resultado de exchangeCodeForTokens: accessToken, idToken, expiresIn y claims verificadas del token de ID
XidRnContextValue Forma del contexto del adaptador devuelta por useXidRnContext

Limitaciones conocidas

  • El SDK no tiene vinculación de remitente DPoP, rechaza offline_access y requiere un nuevo flujo de autorización después de que caduque el token de acceso.
  • useAuth().isSignedIn refleja una sesión almacenada localmente solo después de verificar el token de ID; no lee una sesión de cookie web.
  • El contexto de organización aún no se rellena desde los tokens almacenados.

Seguridad

  • Código de autorización solo con PKCE S256. Sin flujo implícito ni password grant.
  • Los clientes públicos nunca almacenan secretos de cliente.
  • El verificador PKCE y el estado OAuth viven en el adaptador de almacenamiento seguro inyectado y se eliminan tras el intercambio de código.
  • signOut borra la sesión local y las credenciales heredadas sin enviar una solicitud de actualización ni de revocación; los fallos de almacenamiento se muestran en signOutState.
Navegación

Escribe para buscar...

Usa las flechas para navegarPulsa Intro para seleccionarPulsa Escape para cerrar