Integrasi Better Auth
Salin prompt setup yang berisi langkah install dan panduan markdown lengkap untuk plugin ini.
Ikhtisar
Bagian berjudul “Ringkasan”Better Auth bekerja dengan baik dengan @capgo/capacitor-social-login ketika Anda ingin sign-in native di perangkat tetapi tetap ingin Better Auth membuat dan mengelola sesi di backend Anda.
Halaman ini berfokus pada dua pola integrasi yang paling cocok:
- Native token handoff untuk Google, Apple, dan Facebook
- Better Auth Generic OAuth untuk provider seperti Auth0, Okta, Keycloak, dan server OIDC kustom
Pola mana yang harus digunakan
Bagian berjudul “Pola mana yang harus digunakan”Gunakan native token handoff
Bagian berjudul “Gunakan native token handoff”Gunakan SocialLogin.login() terlebih dahulu, lalu kirimkan token yang dikembalikan ke Better Auth dengan authClient.signIn.social() ketika Anda menggunakan:
- Apple
Gunakan Better Auth Generic OAuth
Bagian berjudul “Gunakan Better Auth Generic OAuth”Biarkan Better Auth mengelola alur redirect OAuth penuh ketika Anda menggunakan:
- Auth0
- Okta
- Keycloak
- GitHub
- OneLogin
- Provider OAuth2 atau OIDC kustom apa pun
Ini menjaga pertukaran sesi tetap di sisi Better Auth dan menghindari duplikasi logika redirect di antara dua sistem.
Setup server Better Auth
Bagian berjudul “Setup server Better Auth”Mulai dengan mengonfigurasi Better Auth dengan provider sosial yang ingin Anda dukung:
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'],});Setup klien Better Auth
Bagian berjudul “Better Auth client setup”import { createAuthClient } from 'better-auth/client';
export const authClient = createAuthClient({ baseURL: 'https://auth.example.com',});Jika Anda menggunakan React, gunakan paket klien Better Auth React yang sudah digunakan oleh aplikasi Anda. Pola handoff token tetap sama.
Contoh Google
Bagian berjudul “Google example”Ini adalah jalur integrasi paling bersih untuk Google sign-in native mobile:
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',});Contoh Apple
Bagian berjudul “Apple example”Untuk Apple, teruskan nonce yang sama ke permintaan login native dan 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',});Contoh Facebook
Bagian berjudul “Contoh Facebook”Better Auth mendokumentasikan dua mode handoff Facebook:
- iOS Limited Login: lewati
idToken - Alur access-token: lewati access token sebagai
tokendanaccessToken
Ini berfungsi dengan bentuk respons dari @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 Generic OAuth dengan Better Auth
Bagian berjudul “Provider OAuth generik dengan Better Auth”Untuk Auth0, Okta, Keycloak, GitHub, Microsoft Entra ID, dan provider serupa, plugin Generic OAuth dari Better Auth biasanya lebih cocok daripada melewatkan token dari SocialLogin.login({ provider: 'oauth2' }).
Server Better Auth
Bagian berjudul “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, }, ], }), ],});Klien Better Auth
Bagian berjudul “Klien 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',});Contoh provider untuk Better Auth Generic OAuth
Bagian berjudul “Contoh provider untuk Better Auth Generic OAuth”Better Auth menyediakan helper yang sudah dikonfigurasi untuk beberapa provider. Ini adalah padanan terdekat dari contoh provider tambahan yang Anda lihat di dokumentasi 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
Bagian berjudul “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
Bagian berjudul “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 dengan konfigurasi Generic OAuth manual
Bagian berjudul “GitHub dengan konfigurasi Generic OAuth manual”GitHub tidak memiliki helper Better Auth di halaman Generic OAuth, jadi gunakan konfigurasi 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',});Catatan dan peringatan
Bagian berjudul “Catatan dan peringatan”-
Gunakan mode online Google Better Auth membutuhkan
idToken, jadigoogle.mode: 'offline'tidak cocok untuk alur handoff ini. -
Gunakan ulang nonce Apple Generate sekali, kirim ke Apple native login, lalu kirim nilai yang sama ke Better Auth.
-
Tangani Facebook secara berbeda per platform Limited Login di iOS memberikan ID token. Alur lain mungkin hanya memberikan access token.
-
Jangan campurkan alur Generic OAuth kecuali ada alasan Jika Better Auth yang mengelola konfigurasi provider OAuth, biarkan Better Auth juga mengelola alur redirect.
Bacaan lanjutan
Bagian berjudul “Bacaan lanjutan”- Dokumentasi provider Google Better Auth
- Dokumentasi provider Apple Better Auth
- Dokumentasi provider Facebook Better Auth
- Dokumentasi plugin Generic OAuth Better Auth
- Social Login: Provider OAuth2 dan OIDC
Lanjut dari Integrasi Better Auth
Bagian berjudul “Lanjut dari Integrasi Better Auth”Jika Anda menggunakan Integrasi Better Auth untuk merencanakan alur autentikasi dan akun, hubungkan dengan Menggunakan @capgo/capacitor-social-login untuk kapabilitas native di Menggunakan @capgo/capacitor-social-login, @capgo/capacitor-social-login untuk detail implementasi di @capgo/capacitor-social-login, @capgo/capacitor-passkey untuk detail implementasi di @capgo/capacitor-passkey, @capgo/capacitor-native-biometric untuk detail implementasi di @capgo/capacitor-native-biometric, dan Autentikasi dua faktor untuk detail implementasi di autentikasi dua faktor.