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).
Jawaban:
Saya hanya berurusan dengan ini sendiri, dan inilah bagian yang menggigit saya:
Di langkah 5 Anda ... Adalah mungkin bagi pengguna untuk mendaftar akun dengan Anda yang sepenuhnya terpisah dari ID Facebook mereka, bukan? Kemudian di lain waktu mereka masuk dengan Facebook .... Dan Anda baru saja membuat mereka akun kedua dan kehilangan yang pertama.
Perlu ada cara untuk masuk ke layanan web Anda, kemudian masuk ke Facebook, dan tangkap hubungan antara ID facebook dan akun lokal.
Terlepas dari itu, rencana Anda kedengarannya solid.
Pembaruan : Facebook telah menambahkan dokumen yang menguraikan skenario seperti ini DI SINI
sumber
Gunakan https untuk mengirimkan token autentikasi ke server Anda, seperti yang dinyatakan oleh Facebook
sumber
Satu masalah yang bisa saya lihat dengan strategi ini, adalah seseorang dapat memberi Anda token akses yang diperoleh untuk aplikasi facebook yang berbeda. Sejauh yang saya tahu, tidak ada cara untuk memverifikasi bahwa token akses adalah untuk aplikasi Anda, jadi Anda hanya akan melanjutkan dan menggunakannya.
Kedengarannya tidak berbahaya. Umumnya orang / aplikasi mencoba melindungi token akses, daripada membaginya.
Salah satu kemungkinan eksploitasi ini adalah, bagi seseorang untuk membuat situs atau aplikasi seluler mereka sendiri, memperoleh token akses untuk pengguna mereka dan mencoba untuk mengotentikasi mereka, menggunakan API Anda. Jika ini berhasil (pengguna memiliki akun facebook di situs Anda), situs jahat akan dapat menggunakan API Anda menyamar sebagai pengguna.
Ini agak sulit, tapi saya pikir itu bisa berhasil.
Sunting: Sepertinya ada cara untuk memvalidasi token akses. Lihat jawaban oleh @Daaniel pada pertanyaan Dapatkan id aplikasi dari token akses pengguna (atau verifikasi aplikasi sumber untuk token) .
sumber
appsecret_proof
harus mencegah hal ini (lihat di sini )appsecret_proof
membantu di sini? Sejauh yang saya mengerti, ini berfungsi untuk membuktikan kepada Facebook bahwa server mengetahui kunci rahasia. Namun, ivant merujuk ke aplikasi jahat yang mendapatkan token dan kemudian mengirimkannya ke API Anda. Server dapat memverifikasi ID aplikasi, tetapi ID aplikasi dapat dengan mudah dipalsukan oleh aplikasi jahat. Jadi ... bagaimana kita mengurangi ini?https://graph.facebook.com/app/?access_token=[user_access_token]
mana mengembalikan id aplikasi, dan kemudian membandingkan id aplikasisolusi Anda benar-benar berfungsi.
Mungkin alternatif: mengapa tidak hanya mendapatkan email pada klien dari permintaan layanan sosial awal dan mengirim ke layanan web Anda? Layanan web bisa menyimpan email, dan mungkin social_provider juga. Saya memahami bahwa layanan web Anda tidak akan dapat memvalidasi dari mana email itu berasal, tetapi tidakkah ada hubungan saling percaya yang tinggi antara layanan web Anda dan klien Anda? Jika ada, sepertinya Anda bisa bergantung pada email yang datang dari tempat yang tepat. Seseorang tolong beri tahu saya apa hal jelas yang saya lewatkan yang membuat pendekatan berbasis email ini konyol ...
sumber