Integrazione di Better Auth
Copia un prompt di configurazione con i passaggi di installazione e la guida markdown completa per questo plugin.
Panoramica
Sezione intitolata “Panoramica”Better Auth funziona bene con @capgo/capacitor-social-login quando desideri il sign-in nativo sul dispositivo, ma vuoi che Better Auth crei e gestisca la sessione sul tuo backend.
Questa pagina si concentra sui due pattern di integrazione ideali:
- Handoff del token nativo per Google, Apple e Facebook
- Better Auth Generic OAuth per provider come Auth0, Okta, Keycloak e server OIDC personalizzati
Quale pattern utilizzare
Sezione intitolata “Quale pattern utilizzare”Usa l'handoff del token nativo
Sezione: “Usa il passaggio del token nativo”Usa SocialLogin.login() per prima cosa, quindi invia il token ricevuto a Better Auth con authClient.signIn.social() quando utilizzi:
- Apple
Usa Better Auth Generic OAuth
Sezione: “Usa Better Auth Generic OAuth”Lascia che Better Auth gestisca l'intero flusso di redirect OAuth quando utilizzi:
- Auth0
- Okta
- Keycloak
- GitHub
- OneLogin
- Qualsiasi provider OAuth2 o OIDC personalizzato
Che mantiene lo scambio della sessione lato Better Auth, evitando di duplicare la logica di redirect tra due sistemi.
Configurazione del server Better Auth
Sezione intitolata “Configurazione del server Better Auth”Inizia configurando Better Auth con i provider social che desideri supportare:
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'],});Configurazione del client Better Auth
Sezione intitolata “Configurazione del client Better Auth”import { createAuthClient } from 'better-auth/client';
export const authClient = createAuthClient({ baseURL: 'https://auth.example.com',});Se usi React, utilizza il pacchetto client Better Auth React già presente nella tua app. Il pattern di handoff del token rimane invariato.
Esempio Google
Sezione intitolata “Esempio Google”Questa è la via più semplice per integrare il login nativo di 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',});Esempio Apple
Sezione intitolata “Esempio Apple”Per Apple, passa lo stesso nonce sia alla richiesta di login nativa che 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',});Esempio Facebook
Sezione intitolata “Esempio Facebook”Better Auth documents two Facebook handoff modes:
- iOS Limited Login: passa il
idToken - Flow Access-token: passa l'access token sia come
tokeneaccessToken
Questo funziona con la struttura della risposta di @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',});Provider OAuth generici con Better Auth
Sezione intitolata “Provider OAuth generici con Better Auth”Per Auth0, Okta, Keycloak, GitHub, Microsoft Entra ID e provider simili, il plugin Generic OAuth di Better Auth è solitamente la scelta migliore rispetto al passaggio di token da SocialLogin.login({ provider: 'oauth2' }).
Server Better Auth
Sezione intitolata “Server 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, }, ], }), ],});Client Better Auth
Sezione intitolata “Client 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',});Esempi provider per Better Auth Generic OAuth
Sezione intitolata “Esempi provider per Better Auth Generic OAuth”Better Auth include helper pre-configurati per diversi provider. Sono i più simili agli esempi di provider extra presenti nella documentazione 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
Sezione intitolata “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
Sezione intitolata “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 configurazione manuale Generic OAuth
Sezione intitolata “GitHub con configurazione manuale Generic OAuth”GitHub non dispone di un helper Better Auth nella pagina Generic OAuth, quindi usa la configurazione manuale:
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',});Note e avvertenze
Sezione intitolata “Note e avvertenze”-
Usa la modalità online di Google Better Auth ha bisogno di
idToken, quindigoogle.mode: 'offline'non è adatto per questo flusso di handoff. -
Riutilizza il nonce di Apple Generalo una volta, invialo al login nativo di Apple e poi invia lo stesso valore a Better Auth.
-
Gestisci Facebook in modo diverso per piattaforma Il Limited Login su iOS fornisce un ID token. Altri flussi potrebbero fornire solo un access token.
-
Non mischiare i flussi OAuth generici a meno che non sia necessario Se Better Auth gestisce la configurazione del provider OAuth, lascia che gestisca anche il flusso di redirect.
Approfondimenti
Sezione intitolata “Approfondimenti”- Documentazione provider Google di Better Auth
- Documentazione provider Apple di Better Auth
- Documentazione provider Facebook di Better Auth
- Documentazione plugin Generic OAuth di Better Auth
- Provider OAuth2 e OIDC per Social Login
Continua dall'integrazione di Better Auth
Sezione intitolata “Continua dall'integrazione di Better Auth”Se stai usando Integrazione di Better Auth per pianificare i flussi di autenticazione e account, collegandolo a Utilizzo di @capgo/capacitor-social-login per la funzionalità nativa in Utilizzo di @capgo/capacitor-social-login, @capgo/capacitor-social-login per i dettagli di implementazione in @capgo/capacitor-social-login, @capgo/capacitor-passkey per i dettagli di implementazione in @capgo/capacitor-passkey, @capgo/capacitor-native-biometric per i dettagli di implementazione in @capgo/capacitor-native-biometric, e Autenticazione a due fattori per i dettagli sull'implementazione dell'autenticazione a due fattori.