Sasaran: Memungkinkan pengguna untuk otentikasi dengan Facebook ke dalam aplikasi iOS yang membutuhkan akses ke layanan web yang dilindungi yang saya jalankan.
Asumsi: Terdapat sistem autentikasi asli (dan pendaftaran) untuk pengguna yang memilih untuk tidak menggunakan Facebook untuk masuk.
Detail:
- Asumsikan kami ingin menawarkan opsi bagi pengguna untuk masuk dengan Facebook tanpa membuat akun / kredensial terpisah untuk sistem kami.
- Karena kami mendukung mekanisme autentikasi asli kami sendiri (nama pengguna dan kata sandi) kami memiliki ID pengguna kami sendiri dan mengeluarkan token otentikasi yang digunakan untuk interaksi berikutnya setelah validasi kredensial awal.
Saya terkejut bahwa Facebook tidak memiliki praktik terbaik untuk ini dalam dokumentasi pengembang mereka. Semua dokumentasi yang ada mengasumsikan Anda sedang membangun FB auth ke situs web, atau aplikasi seluler mandiri tanpa layanan yang memerlukan otentikasi.
Inilah pemikiran awal saya tentang bagaimana ini akan dirancang tetapi ingin validasi apakah itu benar.
- Klien membuka Facebook iOS Login
- Pengguna UI masuk dengan kredensial Facebook dan mendapat token akses
- Aplikasi iOS memberikan token akses ke server kami
Server kami berbicara dengan FB graph API menggunakan token akses ke (a) memvalidasi token dan (b) mendapatkan ID pengguna FB untuk token akses itu.
mis. Server kami akan memanggil https://graph.facebook.com/me/?access_token=XYZ yang akan mengembalikan info profil dalam objek JSON
Dengan asumsi itu valid, server kami mengekstrak ID Pengguna dari objek JSON dan memeriksa apakah pengguna sudah memiliki akun. Jika demikian, kami mengeluarkan tiket autentikasi kami sendiri ke klien untuk digunakan untuk sesi itu. Jika pengguna tidak memiliki akun, kami membuat yang baru dengan ID Pengguna Facebook, menetapkan UserID unik kami sendiri dan mengeluarkan tiket autentikasi kami.
- Klien kemudian memberikan tiket auth kembali pada interaksi berikutnya yang perlu otentikasi.
Ini sepertinya pendekatan yang tepat untuk saya tetapi tidak yakin apakah saya melewatkan sesuatu yang sangat mendasar dan menuruni jalan yang salah (rumit).