Lanjutkan dari Pengaturan Login Facebook
Copy sebuah prompt pengaturan dengan langkah instalasi dan panduan markdown lengkap untuk plugin ini.
Bab yang berjudul “Pendahuluan”
Dalam panduan ini, Anda akan belajar cara mengatur Facebook Login dengan __CAPGO_KEEP_0__ Social Login. Anda memerlukan hal-hal berikut:In this guide, you will learn how to setup Facebook Login with Capgo Social Login. You will need the following:
- Akun Pengembang Facebook
- Nama Paket Aplikasi Anda/ID Paket
- Akses Terminal untuk Menghasilkan Hash Kunci (Android)
Pengaturan Umum
Bab yang Berjudul “Pengaturan Umum”Jika Anda belum memiliki aplikasi Facebook yang dibuat, ikuti langkah-langkah berikut:
-
Buat Aplikasi Facebook
Ikuti tutorial untuk Buat Aplikasi
-
Tambahkan Facebook Login ke aplikasi Anda
Pada Dashboard Pengembang Facebook Anda, tambahkan produk Facebook Login ke aplikasi Anda
-
Sebelum Anda dapat merilis aplikasi ke publik, ikuti langkah ini tutorial untuk mempublikasikannya
Informasi Penting
Bab berjudul “Informasi Penting”Berikut adalah tempat Anda dapat menemukan informasi kunci yang dibutuhkan untuk integrasi:
-
CLIENT_TOKEN:
-
APP_ID:
-
APP_NAME:
Penggunaan Facebook untuk Bisnis
Bab berjudul “Penggunaan Facebook untuk Bisnis”Plugin ini mendukung Penggunaan Facebook untuk Bisnis untuk fitur dan izin bisnis. Akun bisnis dapat meminta izin tambahan di atas izin konsumen standar, termasuk pengelolaan Instagram dan Halaman.
izin bisnis yang didukung termasuk:
instagram_basic- Akses ke Instagram Basic Display APIinstagram_manage_insights- Akses ke Instagram Insightspages_show_list- Daftar Halaman yang dikelola oleh orang tersebutpages_read_engagement- Baca data interaksi dari Halamanpages_manage_posts- Kelola postingan di Halamanbusiness_management- Kelola aset bisnis
- Lihat - Referensi Izin Facebook - untuk daftar izin lengkap.
- Persyaratan pengaturan:
- - Aplikasi Facebook Anda harus dikonfigurasi sebagai Aplikasi Bisnis di Konsole Pengembang Facebook.
- - Izin bisnis mungkin memerlukan Tinjauan Aplikasi Facebook sebelum digunakan dalam produksi.
- Aplikasi Anda harus mematuhi kebijakan penggunaan bisnis Facebook.
Instagram Basic Access
Bab berjudul "Instagram Basic Access"await SocialLogin.initialize({ facebook: { appId: 'your-business-app-id', clientToken: 'your-client-token', },});
const res = await SocialLogin.login({ provider: 'facebook', options: { permissions: [ 'email', 'public_profile', 'instagram_basic', 'pages_show_list', 'pages_read_engagement', ], },});
const profile = await SocialLogin.providerSpecificCall({ call: 'facebook#getProfile', options: { fields: ['id', 'name', 'email', 'instagram_business_account'], },});Pengelolaan Halaman
Bab berjudul "Pengelolaan Halaman"const res = await SocialLogin.login({ provider: 'facebook', options: { permissions: [ 'email', 'pages_show_list', 'pages_manage_posts', 'pages_read_engagement', ], },});
const profile = await SocialLogin.providerSpecificCall({ call: 'facebook#getProfile', options: { fields: ['id', 'name', 'accounts{id,name,instagram_business_account}'], },});Catatan penting:
- Anda dapat menguji izin bisnis dengan pengguna uji dan aplikasi pengembangan sebelum tinjauan aplikasi.
- Sebagian besar izin bisnis memerlukan tinjauan aplikasi Facebook sebelum penggunaan produksi.
- API bisnis memiliki batasan kecepatan yang berbeda. Tinjau dokumentasi platform Facebook saat ini sebelum peluncuran.
- Ikuti Petunjuk Integrasi Bisnis Facebook ketika mengonfigurasi aplikasi.
Pengaturan Android
Bab berjudul “Pengaturan Android”-
Tambahkan izin internet ke aplikasi Anda
AndroidManifest.xmlPastikan baris ini ada:
<uses-permission android:name="android.permission.INTERNET"/> -
Generasi 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 password, gunakan:
android -
Tambahkan hash kunci ke aplikasi Facebook Anda
- Pergi ke dashboard aplikasi Anda di Facebook Developers
- Navigasikan ke Pengaturan > Dasar
- Geser ke bawah 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 rilis
-
Perbarui
AndroidManifest.xmluntuk termasuk:<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
Bab yang berjudul “Pengaturan iOS”-
Tambahkan platform iOS di Konsole Pengembang Facebook
- Kunjungi dashboard aplikasi Anda di Facebook Developers
- Beralih 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 Anda:
<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> -
Ubahlah
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
Bab berjudul “Menggunakan Facebook Login di Aplikasi Anda”-
Mulai 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',}}) -
Mengimplementasikan 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);}}}Keterbatasan Tipe Token: The
getProfilepanggilan hanya akan berfungsi ketika Anda memiliki token akses token akses (login standar dengan tracking diizinkan). Jika pengguna menolak tracking atau Anda menggunakan login terbatas (token JWT saja), 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 mengolah Tipe Token Berbeda Karena pengguna iOS dapat menerima token akses atau token JWT tergantung pada pilihan Penggunaan Data Pengguna mereka, sementara pengguna Android selalu menerima token akses.
Tipe Token oleh Platform
Judul Bagian “Tipe Token oleh Platform”| Platform | Pengaturan Login Terbatas | Pilihan Pengguna ATT | Hasil Tipe Token |
|---|---|---|---|
| iOS | true | Apapun | Token JWT |
| iOS | false | Mengizinkan pelacakan | Token Akses |
| iOS | false | Mengingkari pelacakan | Token JWT (otomatis override) |
| Andorid | Apapun | Tidak Ada | Token Akses (selalu) |
Pengimplementasian Backend
Bab berjudul “Pengimplementasian Backend”-
Detect 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' });}}); -
Pengelolaan 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
Bab berjudul “Konsiderasi Utama”Access Token (Login Standar):
- ✅ Android: Selalu tersedia (pengaturan iOS-only tidak berlaku)
- ✅ iOS: Hanya ketika pengguna secara eksplisit mengizinkan pengikatan aplikasi
- ✅ Dapat digunakan untuk mengakses Grafik Facebook API
- ✅ Waktu kadaluarsa yang lebih lama
- ✅ Data pengguna yang lebih banyak tersedia
- ❌ Menjadi kurang umum pada iOS sebagai pengguna semakin sering menolak tracking
Token JWT (Modus Privasi iOS-Only):
- ❌ Anda: Tidak pernah terjadi (tidak didukung)
- ✅ iOS: Ketika tracking ditolak atau
limitedLogin: true - ✅ Menghormati preferensi privasi pengguna iOS
- ❌ Mengandung informasi pengguna dasar hanya
- Waktu kadaluarsa yang lebih singkat ❌
- Tidak ada akses ke API Graph Facebook ❌
- ⚠️ Skenario yang paling umum sekarang untuk pengguna iOS
Behavior yang Spesifik Platform:
- Aplikasi iOS: Harus menangani baik token akses dan JWT token
- Aplikasi Android: Hanya perlu menangani token akses
- Aplikasi multi-platform: Harus mengimplementasikan kedua metode penanganan 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 penghasilan 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
Masalah Lingkungan PengembanganMasalah Umum: ionic serve HTTP URL yang rusak mengganggu autentikasi Facebook
| Lingkungan | Kriptografi 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 Pengembangan Capacitor
Judul Bagian “Solusi untuk Pengembangan Capacitor”-
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 coba 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
Bagian berjudul “Catatan Integrasi Firebase”Dokumentasi Firebase terbaru memerlukan token JWT dengan nonce untuk autentikasi Facebook, terlepas dari pengaturan login. Pendekatan ini berfungsi dengan baik baik untuk pengaturan login yang diaktifkan maupun dinonaktifkan 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 jaringan IP (bukan localhost), autentikasi Facebook akan gagal karena pembatasan crypto API. Gunakan localhost atau HTTPS untuk pengujian web
Pengaturan
Bagian berjudul ‘Pengaturan’Masalah Umum dan Solusinya
Bagian berjudul ‘Masalah Umum dan Solusinya’-
Error Hash Kunci pada Android
- Periksa kembali bahwa Anda telah menambahkan kunci hash yang benar ke dashboard Facebook
- Pastikan Anda telah menambahkan kunci hash debug dan release
- Pastikan Anda menggunakan keystore yang benar saat menghasilkan hash
-
Tombol login Facebook tidak muncul
- Verifikasi semua entri manifest yang benar
- Pastikan ID Aplikasi Facebook dan Token Klien Anda benar
- Pastikan Anda telah menginisialisasi SDK dengan benar
-
Masalah iOS yang umum
- Pastikan semua entri Info.plist Anda benar
- Verifikasi bahwa skema URL Anda telah dikonfigurasi dengan benar
- Pastikan 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 > Pengguna Uji
- Buat pengguna uji
- Gunakan kreditensi ini untuk tes
-
Tes baik build debug maupun release
- Build debug dengan hash kunci debug
- Build release dengan hash kunci release
- Tes pada baik emulator maupun perangkat fisik
Ingatlah untuk tes alur login lengkap, termasuk:
- Login sukses
- Pembatalan login
- Pengelolaan kesalahan
- Fungsi logout
Teruskan dari Pengaturan Login Facebook
Bagian berjudul “Teruskan dari Pengaturan Login Facebook”Jika Anda menggunakan Pengaturan Login Facebook untuk merencanakan autentikasi dan alur akun, hubungkannya dengan Menggunakan @capgo/capacitor-social-login untuk kemampuan asli di Menggunakan @capgo/capacitor-social-login Menggunakan @capgo/capacitor-social-login untuk detail implementasi di @capgo/capacitor-social-login Menggunakan @capgo/capacitor-passkey untuk detail implementasi di @capgo/capacitor-passkey Menggunakan @capgo/capacitor-native-biometric untuk detail implementasi di @capgo/capacitor-native-biometric, dan Autentikasi dua faktor untuk detail implementasi di Autentikasi Dua Faktor.