Kami memiliki situs web di mana satu - satunya cara untuk masuk dan mengautentikasi diri Anda dengan situs tersebut adalah dengan Facebook (ini bukan pilihan saya). Pertama kali Anda masuk dengan Facebook, akun dibuat secara otomatis untuk Anda.
Kami sekarang ingin membuat aplikasi iPhone untuk situs kami dan juga API publik untuk orang lain menggunakan layanan kami.
Pertanyaan ini tentang bagaimana mengotentikasi dengan situs web kami dari aplikasi / API dan dipecah menjadi 2 bagian:
- Apa cara yang benar untuk menangani otentikasi REST dari API ke situs web yang hanya menggunakan Facebook OAuth sebagai metode otentikasi?
Saya telah membaca dan meneliti banyak tentang metode standar otentikasi untuk REST API. Kami tidak dapat menggunakan metode seperti Basic Auth melalui HTTPS , karena tidak ada kredensial untuk pengguna tersebut. Sesuatu seperti ini tampaknya hanya untuk mengautentikasi aplikasi menggunakan API.
Saat ini, cara terbaik yang dapat saya pikirkan adalah Anda mencapai / mengotorisasi titik akhir di API kami, mengalihkan ke Facebook OAuth, kemudian mengarahkan kembali ke situs dan memberikan 'token' yang dapat digunakan oleh pengguna API untuk mengautentikasi selanjutnya. permintaan.
- Untuk aplikasi resmi yang kami buat, kami tidak perlu menggunakan API publik dengan cara yang sama. Lalu, apa cara terbaik untuk berbicara dengan situs web kami dan mengautentikasi pengguna?
Saya memahami (menurut saya) cara mengautentikasi aplikasi pihak ketiga yang menggunakan API kami, menggunakan kunci API (publik) dan kunci rahasia (pribadi). Namun, ketika harus mengautentikasi pengguna yang menggunakan aplikasi, saya agak bingung tentang bagaimana cara melakukannya ketika satu-satunya cara kami harus mengautentikasi pengguna adalah Facebook.
Saya merasa seperti saya kehilangan sesuatu yang sangat jelas, atau tidak sepenuhnya memahami cara kerja REST API publik, jadi saran dan bantuan apa pun akan sangat kami hargai.
Jawaban:
UPDATE: lihat di bawah
Saya telah berpikir keras tentang pertanyaan ini juga. Belum sepenuhnya jelas bagi saya, tetapi inilah rute yang ingin saya tuju. Saya membuat REST API dan hanya pengguna saya yang diautentikasi dengan Facebook connect.
Di KLIEN:
Di API (untuk setiap metode yang membutuhkan otentikasi pengguna):
Saya belum menguji ini. Bagaimana bunyinya?
--- Update: 27 Juli 2014 untuk menjawab pertanyaan ---
Saya hanya menggunakan pertukaran di atas satu kali saat login. Setelah saya menentukan pengguna mana yang masuk, saya membuat token akses saya sendiri, dan token itu digunakan sejak saat itu. Jadi aliran baru terlihat seperti ini ...
Di KLIEN:
Di API
sumber
Ini adalah implementasi saya menggunakan JWTs (JSON Web Tokens), pada dasarnya mirip dengan jawaban terbaru Chris. Saya telah menggunakan Facebook JS SDK dan JWT.
Inilah implementasi saya.
Klien: Gunakan Facebook JS SDK untuk masuk dan mendapatkan token akses.
Klien: Minta JWT dari API saya dengan memanggil
/verify-access-token
titik akhir.MyAPI: Menerima token akses, verifikasi dengan memanggil
/me
titik akhir API Facebook.MyAPI: Jika token akses valid, temukan pengguna dari database, masukkan pengguna jika ada. Buat JWT dengan bidang wajib sebagai muatan, tetapkan masa berlaku, tanda tangani dengan kunci rahasia dan kirim kembali ke klien.
Klien: Menyimpan JWT di penyimpanan lokal.
Klien: Mengirim token (JWT dari langkah 5) bersama dengan permintaan untuk panggilan API berikutnya.
MyAPI: validasi token dengan kunci rahasia, jika token valid, tukarkan token dengan yang baru, kirim kembali ke klien bersama dengan respons API. (Tidak ada panggilan API eksternal untuk verifikasi token di sini setelahnya) [jika token tidak valid / kadaluwarsa, minta klien untuk mengautentikasi lagi dan ulangi dari 1]
Klien Mengganti token yang disimpan dengan yang baru dan menggunakannya untuk panggilan API berikutnya. Setelah masa berlaku token terpenuhi, token kedaluwarsa mencabut akses ke API.
Setiap token digunakan sekali.
Baca lebih banyak jawaban tentang keamanan dan JWT
Seberapa aman JWT
Jika Anda dapat memecahkan kode JWT, bagaimana mereka aman?
JSON Web Tokens (JWT) sebagai identifikasi pengguna dan token otentikasi
sumber
/debug_token
begitu, jadi Anda dapat memeriksa bahwa token sebenarnya untuk aplikasi Anda.access_token
di Klien. Gunakan "alur kerja kode". Luluscode
untuk MyAPI dan membuat perjalanan lain bulat untuk Facebook untuk pertukarancode
denganaccess_token
. Ini dijelaskan lebih menyeluruh di sini: developers.facebook.com/docs/facebook-login/securitySaya mencoba menjawab pertanyaan yang sama dan telah melalui banyak bacaan akhir-akhir ini ...
Saya tidak akan memiliki "jawaban" tetapi hal-hal menjadi sedikit lebih jelas bagi saya. Sudahkah Anda membaca komentar di artikel yang Anda sebutkan ? Saya menemukan mereka sangat menarik dan bermanfaat.
Akibatnya, dan mengingat bagaimana hal-hal telah berkembang sejak artikel pertama ditulis, inilah yang menurut saya akan saya lakukan:
HTTPS di mana-mana - ini memungkinkan Anda melupakan HMAC, penandatanganan, nonce, ...
Gunakan OAuth2:
Ketika permintaan otentikasi datang dari aplikasi / situs web saya sendiri, gunakan 'trik' ini (atau variasinya) yang dijelaskan dalam balasan artikel yang disebutkan sebelumnya.
Dalam kasus saya, saya memiliki dua jenis pengguna: mereka yang memiliki kredensial masuk / sandi klasik dan mereka yang telah mendaftar dengan Facebook Connect.
Jadi saya akan memberikan formulir login biasa dengan tombol "Masuk dengan Facebook". Jika pengguna masuk dengan kredensial "klasik", saya hanya akan mengirimkannya ke titik akhir OAuth2 saya dengan
grant_type=password
.Jika dia memilih untuk masuk melalui Facebook, menurut saya itu akan menjadi proses dua langkah:
Harap dicatat bahwa saya masih meneliti semua hal ini, jadi itu mungkin bukan jawaban yang sempurna ... bahkan mungkin bukan jawaban yang benar! Tapi saya pikir itu akan menjadi titik awal yang baik. Gagasan menggunakan "hibah ekstensi" untuk otentikasi Facebook mungkin melibatkan keharusan mendaftarkannya untuk melakukan sesuatu dengan benar? Saya tidak begitu yakin.
Bagaimanapun, saya harap saya dapat membantu Anda sedikit, dan setidaknya itu dapat memulai diskusi untuk menemukan solusi terbaik untuk masalah ini :)
Perbarui
Login Facebook bukanlah solusi seperti yang ditunjukkan dalam komentar: siapa pun dapat mengirim ID pengguna sewenang-wenang dan masuk sebagai pengguna ini di API.
Bagaimana melakukannya seperti ini:
Terlihat lebih baik?
sumber