Integración de Better Auth
Copia un prompt de configuración con los pasos de instalación y la guía completa en markdown para este plugin.
Better Auth funciona muy bien con @capgo/capacitor-social-login cuando buscas un sign-in nativo en el dispositivo, pero quieres que Better Auth cree y gestione la sesión en tu backend.
Esta página se centra en los dos patrones de integración que mejor se adaptan:
- Handoff de tokens nativos para Google, Apple y Facebook
- Better Auth Generic OAuth para proveedores como Auth0, Okta, Keycloak y servidores OIDC personalizados
Qué patrón utilizar
Sección titulada “Qué patrón usar”Usar handoff de tokens nativos
Sección titulada “Usa el handoff de tokens nativos”Usa SocialLogin.login() primero, luego envía el token recibido a Better Auth con authClient.signIn.social() cuando uses:
- Apple
Usa Better Auth Generic OAuth
Sección titulada “Usa Better Auth Generic OAuth”Deja que Better Auth gestione todo el flujo de redirección OAuth cuando uses:
- Auth0
- Okta
- Keycloak
- GitHub
- OneLogin
- Cualquier proveedor OAuth2 u OIDC personalizado
Esto mantiene el intercambio de sesión en el lado de Better Auth y evita duplicar la lógica de redirección entre dos sistemas.
Configuración del servidor de Better Auth
Sección titulada “Configuración del servidor de Better Auth”Comienza configurando Better Auth con los proveedores sociales que quieras soportar:
import { betterAuth } from 'better-auth';
export const auth = betterAuth({ baseURL: process.env.BETTER_AUTH_URL, socialProviders: { google: { clientId: process.env.GOOGLE_CLIENT_ID as string, clientSecret: process.env.GOOGLE_CLIENT_SECRET as string, }, apple: { clientId: process.env.APPLE_CLIENT_ID as string, clientSecret: process.env.APPLE_CLIENT_SECRET as string, appBundleIdentifier: process.env.APPLE_APP_BUNDLE_IDENTIFIER as string, }, facebook: { clientId: process.env.FACEBOOK_CLIENT_ID as string, clientSecret: process.env.FACEBOOK_CLIENT_SECRET as string, }, }, trustedOrigins: ['https://appleid.apple.com'],});Configuración del cliente de Better Auth
Sección titulada “Configuración del cliente de Better Auth”import { createAuthClient } from 'better-auth/client';
export const authClient = createAuthClient({ baseURL: 'https://auth.example.com',});Si usas React, utiliza el paquete cliente de Better Auth que ya emplea tu app. El patrón de transferencia de tokens sigue siendo el mismo.
Ejemplo con Google
Sección titulada “Ejemplo con Google”Esta es la ruta de integración más limpia para el sign-in nativo de Google:
import { SocialLogin } from '@capgo/capacitor-social-login';import { authClient } from '@/lib/auth-client';
const googleResult = await SocialLogin.login({ provider: 'google', options: { scopes: ['profile', 'email'], },});
if (googleResult.result.responseType !== 'online' || !googleResult.result.idToken) { throw new Error('Google online mode with idToken is required for Better Auth.');}
await authClient.signIn.social({ provider: 'google', idToken: { token: googleResult.result.idToken, accessToken: googleResult.result.accessToken?.token, }, callbackURL: '/dashboard',});Ejemplo con Apple
Sección titulada “Ejemplo con Apple”Para Apple, pasa el mismo nonce tanto a la solicitud de login nativa como a Better Auth:
import { SocialLogin } from '@capgo/capacitor-social-login';import { authClient } from '@/lib/auth-client';
const nonce = crypto.randomUUID();
const appleResult = await SocialLogin.login({ provider: 'apple', options: { scopes: ['email', 'name'], nonce, },});
if (!appleResult.result.idToken) { throw new Error('Apple idToken is required for Better Auth.');}
await authClient.signIn.social({ provider: 'apple', idToken: { token: appleResult.result.idToken, nonce, accessToken: appleResult.result.accessToken?.token, }, callbackURL: '/dashboard',});Ejemplo de Facebook
Sección titulada “Ejemplo de Facebook”Better Auth documenta dos modos de handoff de Facebook:
- iOS Limited Login: pasa el
idToken - Flujo de Access-token: pasa el access token como ambos
tokenyaccessToken
Esto funciona con la estructura de respuesta de @capgo/capacitor-social-login:
import { SocialLogin } from '@capgo/capacitor-social-login';import { authClient } from '@/lib/auth-client';
const facebookResult = await SocialLogin.login({ provider: 'facebook', options: { permissions: ['email', 'public_profile'], },});
const betterAuthToken = facebookResult.result.idToken ? { token: facebookResult.result.idToken, } : facebookResult.result.accessToken?.token ? { token: facebookResult.result.accessToken.token, accessToken: facebookResult.result.accessToken.token, } : null;
if (!betterAuthToken) { throw new Error('Facebook idToken or access token is required for Better Auth.');}
await authClient.signIn.social({ provider: 'facebook', idToken: betterAuthToken, callbackURL: '/dashboard',});Proveedores OAuth genéricos con Better Auth
Sección titulada “Proveedores OAuth genéricos con Better Auth”Para Auth0, Okta, Keycloak, GitHub, Microsoft Entra ID y proveedores similares, el plugin Generic OAuth de Better Auth suele ser mejor que pasar tokens desde SocialLogin.login({ provider: 'oauth2' }).
Servidor de Better Auth
Sección titulada “Servidor de Better Auth”import { betterAuth } from 'better-auth';import { genericOAuth } from 'better-auth/plugins';
export const auth = betterAuth({ plugins: [ genericOAuth({ config: [ { providerId: 'keycloak', discoveryUrl: 'https://sso.example.com/realms/mobile/.well-known/openid-configuration', clientId: process.env.KEYCLOAK_CLIENT_ID as string, clientSecret: process.env.KEYCLOAK_CLIENT_SECRET as string, }, ], }), ],});Cliente de Better Auth
Sección titulada “Cliente de Better Auth”import { createAuthClient } from 'better-auth/client';import { genericOAuthClient } from 'better-auth/client/plugins';
export const authClient = createAuthClient({ baseURL: 'https://auth.example.com', plugins: [genericOAuthClient()],});
await authClient.signIn.oauth2({ providerId: 'keycloak', callbackURL: '/dashboard',});Ejemplos de proveedores para Better Auth Generic OAuth
Sección titulada “Ejemplos de proveedores para Better Auth Generic OAuth”Better Auth incluye helpers preconfigurados para varios proveedores. Son los que más se acercan a los ejemplos de proveedores adicionales que ves en la documentación del plugin social-login.
import { betterAuth } from 'better-auth';import { auth0, genericOAuth } from 'better-auth/plugins';
export const auth = betterAuth({ plugins: [ genericOAuth({ config: [ auth0({ providerId: 'auth0', domain: 'dev-example.eu.auth0.com', clientId: process.env.AUTH0_CLIENT_ID as string, clientSecret: process.env.AUTH0_CLIENT_SECRET as string, scopes: ['openid', 'profile', 'email', 'offline_access'], }), ], }), ],});await authClient.signIn.oauth2({ providerId: 'auth0', callbackURL: '/dashboard',});Microsoft Entra ID
Sección titulada “Microsoft Entra ID”import { betterAuth } from 'better-auth';import { genericOAuth, microsoftEntraId } from 'better-auth/plugins';
export const auth = betterAuth({ plugins: [ genericOAuth({ config: [ microsoftEntraId({ providerId: 'entra', tenantId: 'common', clientId: process.env.AZURE_CLIENT_ID as string, clientSecret: process.env.AZURE_CLIENT_SECRET as string, scopes: ['openid', 'profile', 'email', 'User.Read'], }), ], }), ],});await authClient.signIn.oauth2({ providerId: 'entra', callbackURL: '/dashboard',});import { betterAuth } from 'better-auth';import { genericOAuth, okta } from 'better-auth/plugins';
export const auth = betterAuth({ plugins: [ genericOAuth({ config: [ okta({ providerId: 'okta', issuer: 'https://dev-12345.okta.com/oauth2/default', clientId: process.env.OKTA_CLIENT_ID as string, clientSecret: process.env.OKTA_CLIENT_SECRET as string, scopes: ['openid', 'profile', 'email', 'offline_access'], }), ], }), ],});await authClient.signIn.oauth2({ providerId: 'okta', callbackURL: '/dashboard',});Keycloak
Sección titulada “Keycloak”import { betterAuth } from 'better-auth';import { genericOAuth, keycloak } from 'better-auth/plugins';
export const auth = betterAuth({ plugins: [ genericOAuth({ config: [ keycloak({ providerId: 'keycloak', issuer: 'https://sso.example.com/realms/mobile', clientId: process.env.KEYCLOAK_CLIENT_ID as string, clientSecret: process.env.KEYCLOAK_CLIENT_SECRET as string, scopes: ['openid', 'profile', 'email', 'offline_access'], }), ], }), ],});await authClient.signIn.oauth2({ providerId: 'keycloak', callbackURL: '/dashboard',});GitHub con config manual de OAuth genérico
Sección titulada “GitHub con config manual de OAuth genérico”GitHub no tiene un helper de Better Auth en la página de OAuth genérico, así que usa la configuración manual:
import { betterAuth } from 'better-auth';import { genericOAuth } from 'better-auth/plugins';
export const auth = betterAuth({ plugins: [ genericOAuth({ config: [ { providerId: 'github', clientId: process.env.GITHUB_CLIENT_ID as string, clientSecret: process.env.GITHUB_CLIENT_SECRET as string, authorizationUrl: 'https://github.com/login/oauth/authorize', tokenUrl: 'https://github.com/login/oauth/access_token', userInfoUrl: 'https://api.github.com/user', scopes: ['read:user', 'user:email'], pkce: true, }, ], }), ],});await authClient.signIn.oauth2({ providerId: 'github', callbackURL: '/dashboard',});Notas y advertencias
Sección titulada “Notas y advertencias”-
Usa el modo online de Google Better Auth necesita el
idToken, así quegoogle.mode: 'offline'no es la opción ideal para este flujo de handoff. -
Reutiliza el nonce de Apple Genéralo una vez, envíalo al login nativo de Apple y luego envía el mismo valor a Better Auth.
-
Gestiona Facebook de forma distinta según la plataforma El Limited Login en iOS te entrega un ID token. Otros flujos podrían darte solo un access token.
-
No mezcles flujos de OAuth genéricos a menos que sea necesario Si Better Auth gestiona la configuración del proveedor OAuth, deja que también gestione el flujo de redirección.
Lecturas recomendadas
Sección titulada “Lecturas adicionales”- Docs del proveedor Google de Better Auth
- Docs del proveedor Apple de Better Auth
- Docs del proveedor Facebook de Better Auth
- Docs del plugin Generic OAuth de Better Auth
- Proveedores OAuth2 y OIDC para Social Login
Continuar desde la integración de Better Auth
Sección titulada “Continuar desde la integración de Better Auth”Si estás usando Integración de Better Auth para planificar los flujos de autenticación y de cuenta, conéctalo con Uso de @capgo/capacitor-social-login para la capacidad nativa en el uso de @capgo/capacitor-social-login, @capgo/capacitor-social-login para los detalles de implementación en @capgo/capacitor-social-login, @capgo/capacitor-passkey para el detalle de implementación en @capgo/capacitor-passkey, @capgo/capacitor-native-biometric para el detalle de implementación en @capgo/capacitor-native-biometric, y Autenticación de dos factores para el detalle de implementación en la autenticación de dos factores.