Pengaturan Login Facebook
Salin prompt pengaturan dengan langkah instalasi dan panduan markdown lengkap untuk plugin ini.
Pendahuluan
Bagian berjudul “Pendahuluan”Dalam panduan ini, Anda akan belajar cara mengatur Facebook Login dengan Capgo Social Login. Anda memerlukan:
- Akun Pengembang Facebook
- Nama paket aplikasi Anda/ID bundle
- Akses ke terminal untuk menghasilkan hash kunci (Android)
Pengaturan Umum
Bab yang berjudul “Pengaturan Umum”Jika Anda belum memiliki aplikasi Facebook yang dibuat, ikuti langkah-langkah ini:
-
Buat Aplikasi Facebook
Ikuti tutorial untuk Buat Aplikasi
-
Tambahkan Login Facebook ke aplikasi Anda
Pada Dashboard Pengembang Facebook Anda, tambahkan produk Login Facebook ke aplikasi Anda
-
Sebelum Anda dapat merilis aplikasi ke publik, ikuti tutorial ini untuk menerbitkannya __CAPGO_KEEP_0__
Informasi Penting
Judul Bagian “Informasi Penting”Berikut adalah tempat untuk menemukan informasi kunci yang Anda butuhkan untuk integrasi:
-
CLIENT_TOKEN:
-
APP_ID:
-
APP_NAME:
Pengaturan Android
Judul Bagian “Pengaturan Android”-
Tambahkan izin internet ke aplikasi Anda
AndroidManifest.xmlPastikan baris ini ada: __CAPGO_KEEP_0__
<uses-permission android:name="android.permission.INTERNET"/> -
Buatlah hash kunci Android Anda
Langkah ini sangat penting untuk keamanan dan diperlukan oleh Facebook. Buka terminal Anda dan jalankan:
Jendela terminal keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 -AKetika diminta untuk memasukkan kata sandi, gunakan:
android -
Tambahkan hash kunci ke aplikasi Facebook Anda
- Lihat dashboard aplikasi Anda di Facebook Developers
- Navigasikan ke Pengaturan > Dasar
- Scroll down ke bagian “Android”
- Klik “Tambah Platform” jika Android belum ditambahkan dan isi detailnya
- Tambahkan hash kunci yang Anda buat
- Untuk produksi, tambahkan baik hash kunci debug maupun release
-
Perbarui
AndroidManifest.xmluntuk mencakup:<application>...<activity android:name="com.facebook.FacebookActivity"android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"android:label="@string/app_name" /><activityandroid:name="com.facebook.CustomTabActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="FB[APP_ID]" /></intent-filter></activity></application>
Pengaturan iOS
Judul Bagian “Pengaturan iOS”-
Tambahkan platform iOS di Konsole Pengembang Facebook
- Lihat dashboard aplikasi Anda di Pengembang Facebook
- Navigasikan ke Pengaturan > Dasar
- Gulir ke bagian bawah halaman dan klik “Tambah Platform”
- Pilih iOS dan isi detail yang diperlukan
-
Buka proyek Xcode Anda dan navigasikan ke Info.plist
-
Tambahkan entri berikut ke Info.plist:
<key>FacebookAppID</key><string>[APP-ID]</string><key>FacebookClientToken</key><string>[CLIENT-TOKEN]</string><key>FacebookDisplayName</key><string>[APP-NAME]</string><key>LSApplicationQueriesSchemes</key><array><string>fbapi</string><string>fb-messenger-share-api</string></array><key>CFBundleURLTypes</key><array><dict><key>CFBundleURLSchemes</key><array><string>fb[APP-ID]</string></array></dict></array> -
Modifikasi
AppDelegate.swiftimport FBSDKCoreKit@UIApplicationMainclass AppDelegate: UIResponder, UIApplicationDelegate {func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {// Override point for customization after application launch.// Initialize Facebook SDKFBSDKCoreKit.ApplicationDelegate.shared.application(application,didFinishLaunchingWithOptions: launchOptions)return true}func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {// Called when the app was launched with a url. Feel free to add additional processing here,// but if you want the App API to support tracking app url opens, make sure to keep this callif (FBSDKCoreKit.ApplicationDelegate.shared.application(app,open: url,sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,annotation: options[UIApplication.OpenURLOptionsKey.annotation])) {return true;} else {return ApplicationDelegateProxy.shared.application(app, open: url, options: options)}}}
Menggunakan Facebook Login di Aplikasi Anda
Bagian berjudul “Menggunakan Facebook Login di Aplikasi Anda”-
Inisialisasi login Facebook di aplikasi Anda
import { SocialLogin } from '@capgo/capacitor-social-login';// Initialize during app startupawait SocialLogin.initialize({facebook: {appId: 'APP_ID',clientToken: 'CLIENT_TOKEN',}}) -
Implementasikan fungsi login
async function loginWithFacebook() {try {const result = await SocialLogin.login({provider: 'facebook',options: {permissions: ['email', 'public_profile'],limitedLogin: false // See Limited Login section below for important details}});console.log('Facebook login result:', result);// Handle successful login} catch (error) {console.error('Facebook login error:', error);// Handle error}} -
Ambil Profil Pengguna
Setelah login sukses, Anda dapat mengambil informasi profil tambahan:
async function getFacebookProfile() {try {const profileResponse = await SocialLogin.providerSpecificCall({call: 'facebook#getProfile',options: {fields: ['id', 'name', 'email', 'first_name', 'last_name', 'picture']}});console.log('Facebook profile:', profileResponse.profile);return profileResponse.profile;} catch (error) {console.error('Failed to get Facebook profile:', error);return null;}}// Example usage after loginasync function loginAndGetProfile() {const loginResult = await loginWithFacebook();if (loginResult) {const profile = await getFacebookProfile();if (profile) {console.log('User ID:', profile.id);console.log('Name:', profile.name);console.log('Email:', profile.email);console.log('Profile Picture:', profile.picture?.data?.url);}}}Penggunaan Token yang Terbatas: Penggilan ini hanya akan berhasil jika Anda memiliki token akses.
getProfilePenggunaan token akses ini hanya berlaku ketika Anda melakukan login dengan metode standar dan memungkinkan tracking. Jika pengguna menolak tracking atau Anda menggunakan login terbatas (token JWT saja), maka panggilan ini akan gagal. Dalam kasus tersebut, gunakan data profil yang disediakan dalam respons login awal. ⚠️ Kritis: Pengelolaan Token Backend Bagian berjudul “⚠️ Kritis: Pengelolaan Token Backend”
Server backend Anda harus menangani dua jenis token yang berbeda karena pengguna iOS dapat menerima token akses atau token JWT tergantung pada pilihan Pengawasan Transparansi Aplikasi mereka, sementara pengguna Android selalu menerima token akses.
Jenis Token oleh Platform
Bab berjudul “Jenis Token oleh Platform”| Platform | Pengaturan Login Terbatas | Pilihan ATT Pengguna | Hasil Jenis Token |
|---|---|---|---|
| iOS | true | Apa saja | Token JWT |
| iOS | false | Mengizinkan pelacakan | Token Akses |
| iOS | false | Menghalangi pelacakan | Token JWT (otomatis override) |
| Android | Apa saja | Tidak Ada | Access Token (selalu) |
Implementasi Backend
Bagian berjudul “Implementasi Backend”-
Deteksi Tipe Token dan Tangani Sesuai
async function loginWithFacebook() {try {const loginResult = await SocialLogin.login({provider: 'facebook',options: {permissions: ['email', 'public_profile'],limitedLogin: false // iOS: depends on ATT, Android: ignored}});if (loginResult.accessToken) {// Access token (Android always, iOS when tracking allowed)return handleAccessToken(loginResult.accessToken.token);} else if (loginResult.idToken) {// JWT token (iOS only when tracking denied or limitedLogin: true)return handleJWTToken(loginResult.idToken);}} catch (error) {console.error('Facebook login error:', error);}} -
Contoh Integrasi Firebase
import { OAuthProvider, FacebookAuthProvider, signInWithCredential } from 'firebase/auth';async function handleAccessToken(accessToken: string, nonce: string) {// For access tokens, use OAuthProvider (new method)const fbOAuth = new OAuthProvider("facebook.com");const credential = fbOAuth.credential({idToken: accessToken,rawNonce: nonce});try {const userResponse = await signInWithCredential(auth, credential);return userResponse;} catch (error) {console.error('Firebase OAuth error:', error);return false;}}async function handleJWTToken(jwtToken: string) {// For JWT tokens, send to your backend for validationtry {const response = await fetch('/api/auth/facebook-jwt', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({ jwtToken })});const result = await response.json();return result;} catch (error) {console.error('JWT validation error:', error);return false;}} -
Validasi JWT Backend
// Backend: Validate JWT token from Facebookimport jwt from 'jsonwebtoken';import { Request, Response } from 'express';app.post('/api/auth/facebook-jwt', async (req: Request, res: Response) => {const { jwtToken } = req.body;try {// Verify JWT token with Facebook's public key// See: https://developers.facebook.com/docs/facebook-login/limited-login/token/validating/#standard-claimsconst decoded = jwt.verify(jwtToken, getFacebookPublicKey(), {algorithms: ['RS256'],audience: process.env.FACEBOOK_APP_ID,issuer: 'https://www.facebook.com' // From: https://www.facebook.com/.well-known/openid-configuration/?_rdr});// Extract user info from JWTconst userInfo = {id: decoded.sub,email: decoded.email,name: decoded.name,isJWTAuth: true};// Create your app's session/tokenconst sessionToken = createUserSession(userInfo);res.json({success: true,token: sessionToken,user: userInfo});} catch (error) {console.error('JWT validation failed:', error);res.status(401).json({ success: false, error: 'Invalid token' });}}); -
Pengolah Token Backend Umum
// Handle both token types in your backendasync function authenticateFacebookUser(tokenData: any) {if (tokenData.accessToken) {// Handle access token - validate with Facebook Graph APIconst response = await fetch(`https://graph.facebook.com/me?access_token=${tokenData.accessToken}&fields=id,name,email`);const userInfo = await response.json();return {user: userInfo,tokenType: 'access_token',expiresIn: tokenData.expiresIn || 3600};} else if (tokenData.jwtToken) {// Handle JWT token - decode and validate// See: https://developers.facebook.com/docs/facebook-login/limited-login/token/validating/#standard-claimsconst decoded = jwt.verify(tokenData.jwtToken, getFacebookPublicKey());return {user: {id: decoded.sub,name: decoded.name,email: decoded.email},tokenType: 'jwt',expiresIn: decoded.exp - Math.floor(Date.now() / 1000)};} else {throw new Error('No valid token provided');}}
Konsiderasi Utama
Bagian berjudul “Konsiderasi Utama”Token Akses (Login Standar):
- ✅ AndroidTersedia selalu (pengaturan iOS tidak berlaku)
- ✅ iOSHanya ketika pengguna mengizinkan pengikatan aplikasi
- ✅ Dapat digunakan untuk mengakses Grafik Facebook API
- ✅ Masa kadaluarsa yang lebih lama
- ✅ Data pengguna yang lebih banyak tersedia
- ❌ Menjadi kurang umum pada iOS seiring meningkatnya penolakan pengguna untuk diikuti
Token JWT (Mode Privasi iOS-Only):
- ❌ AndroidTidak pernah terjadi (tidak didukung)
- ✅ iOS: Ketika tracking ditolak atau
limitedLogin: true - ✅ Menghormati preferensi privasi pengguna iOS
- ❌ Mengandung informasi pengguna dasar saja
- ❌ Masa berlaku yang lebih singkat
- ❌ Tidak memiliki akses ke Facebook Graph API
- ⚠️ Sekarang skenario yang paling umum untuk pengguna iOS
Tingkah Laku yang Spesifik untuk Platform:
- Aplikasi iOS: Harus menghandle baik token akses dan JWT tokens
- Aplikasi Android: Hanya perlu menghandle token akses
- Aplikasi lintas platform: Harus mengimplementasikan kedua metode pengelolaan token
Persyaratan Konteks yang Aman (Web/Capacitor)
Judul Bagian “Persyaratan Konteks yang Aman (Web/Capacitor)”Keterbatasan Kriptografi API
Judul Bagian “Keterbatasan Kriptografi API”Alur login Facebook yang diperbarui memerlukan Kriptografi Web API untuk penggunaan nonce, yang hanya tersedia di konteks yang aman:
// This requires secure context (HTTPS or localhost)async function sha256(message: string) { const msgBuffer = new TextEncoder().encode(message); const hashBuffer = await crypto.subtle.digest("SHA-256", msgBuffer); // ❌ Fails in insecure context // ...}Masalah Lingkungan Pengembangan
Judul bagian “Masalah Lingkungan Pengembangan”Masalah Umum: ionic serve dengan URL HTTP mengganggu autentikasi Facebook
| Lingkungan | Kripto API Tersedia | Login Facebook Berfungsi |
|---|---|---|
http://localhost:3000 | ✅ Ya | ✅ Ya |
http://127.0.0.1:3000 | ✅ Ya | ✅ Ya |
http://192.168.1.100:3000 | ❌ Tidak | ❌ Tidak |
https://any-domain.com | ✅ Ya | ✅ Ya |
Solusi untuk Capacitor Pengembangan
Judul bagian “Solusi untuk Capacitor Pengembangan”-
Gunakan localhost untuk pengujian web
Jendela terminal # Instead of ionic serve --host=0.0.0.0ionic serve --host=localhost -
Aktifkan HTTPS di Ionic
Jendela terminal ionic serve --ssl -
Uji pada perangkat nyata
Jendela terminal # Capacitor apps run in secure context on devicesionic cap run iosionic cap run android -
Penghasilan nonce alternatif untuk pengembangan
async function generateNonce() {if (typeof crypto !== 'undefined' && crypto.subtle) {// Secure context - use crypto.subtlereturn await sha256(Math.random().toString(36).substring(2, 10));} else {// Fallback for development (not secure for production)console.warn('Using fallback nonce - not secure for production');return btoa(Math.random().toString(36).substring(2, 10));}}
Catatan Integrasi Firebase
Judul bagian “Catatan Integrasi Firebase”Dokumentasi Firebase terbaru memerlukan token JWT dengan nonce untuk autentikasi Facebook, terlepas dari pengaturan login. Pendekatan ini berfungsi dengan baik pada baik limitedLogin: true dan limitedLogin: false:
// Both modes can return JWT tokens depending on user choice const loginResult = await SocialLogin.login({ provider: 'facebook', options: { permissions: ['email', 'public_profile'], limitedLogin: false, // true = always JWT, false = depends on user tracking choice nonce: nonce } });Keterbatasan PengembanganJika Anda menggunakan ionic serve pada IP jaringan (bukan localhost), login Facebook akan gagal karena pembatasan crypto API . Gunakan localhost atau HTTPS untuk pengujian web.
Pengaturan
Bagian berjudul “Pengaturan”Masalah Umum dan Solusi
Bagian berjudul “Masalah Umum dan Solusi”-
Error hash kunci pada Android
- Periksa kembali apakah Anda telah menambahkan hash kunci yang benar ke dashboard Facebook
- Untuk rilis, pastikan Anda telah menambahkan kedua hash kunci debug dan rilis
- Verifikasi apakah Anda menggunakan keystore yang benar ketika menghasilkan hash
-
Tombol login Facebook tidak muncul
- Verifikasi semua entri manifest yang benar
- Periksa apakah ID aplikasi Facebook dan Token Klien Anda benar
- Pastikan Anda telah menginisialisasi SDK dengan benar
-
Issues iOS yang umum
- Pastikan semua entri Info.plist Anda benar
- Verifikasi apakah skema URL Anda telah dikonfigurasi dengan benar
- Periksa apakah ID paket Anda sesuai dengan yang terdaftar di dashboard Facebook
Pengujian
Bagian berjudul “Pengujian”-
Sebelum melakukan pengujian, tambahkan pengguna uji di Konsole Pengembang Facebook
- Lihat Roles > Pengguna Uji
- Buat pengguna uji
- Gunakan kreditensial ini untuk pengujian
-
Lakukan pengujian pada baik build debug maupun release
- Build debug dengan hash kunci debug
- Build release dengan hash kunci release
- Lakukan pengujian pada baik perangkat emulator maupun fisik
Jangan lupa melakukan pengujian pada alur login yang lengkap, termasuk:
- Login sukses
- Penghentian login
- Pengelolaan Error
- Fungsi Logout
Lanjutkan dari Pengaturan Login Facebook
Bagian berjudul “Lanjutkan dari Pengaturan Login Facebook”Jika Anda menggunakan Pengaturan Login Facebook untuk merencanakan autentikasi dan aliran akun, hubungkannya dengan Menggunakan @capgo/capacitor-login-sosial untuk kemampuan asli dalam Menggunakan @capgo/capacitor-login-sosial, Menggunakan @capgo/capacitor-login-sosial untuk detail implementasi dalam @capgo/capacitor-login-sosial, Menggunakan @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.