Bagaimana seseorang menangani otentikasi (lokal dan Facebook, misalnya) menggunakan passport.js, melalui RESTful API alih-alih melalui antarmuka web?
Masalah khusus adalah menangani pengalihan data dari panggilan balik ke respons RESTful (JSON) vs menggunakan res.send khas ({data: req.data}), menyiapkan titik akhir awal / login yang mengalihkan ke Facebook (/ login tidak dapat diakses melalui AJAX, karena itu bukan respons JSON - itu adalah pengalihan ke Facebook dengan panggilan balik).
Saya telah menemukan https://github.com/halrobertson/test-restify-passport-facebook , tapi saya kesulitan memahaminya.
Lebih lanjut, bagaimana cara passport.js menyimpan kredensial autentik? Server (atau layanannya?) Didukung oleh MongoDB, dan saya berharap kredensial (login & hash dari pw) disimpan di sana, tapi saya tidak tahu apakah passport.js memiliki kemampuan seperti ini.
sumber
passport-facebook
. Setelah Anda berhasil, langkah selanjutnya adalah mulai memahami cara kerja Paspor, dan cara menyimpan kredensial. Menyambungkannya ke Restify ( lihat di sini untuk versi terbaru dari yang Anda sebutkan) akan menjadi salah satu langkah terakhir (atau Anda bisa mengimplementasikan antarmuka REST di Express).Jawaban:
Ada banyak pertanyaan yang diajukan di sini, dan tampaknya meskipun pertanyaan-pertanyaan itu ditanyakan dalam konteks Node dan paspor. Namun pertanyaan sebenarnya lebih banyak tentang alur kerja daripada bagaimana melakukan ini dengan teknologi tertentu.
Mari kita gunakan contoh setup @Keith, dimodifikasi sedikit untuk keamanan tambahan:
https://example.com
melayani aplikasi klien Javascript satu halamanhttps://example.com/api
menyediakan dukungan server ke aplikasi klien kayahttps://example.com/api
https://example.com/api
tetapi tidak tahu tentang server web dihttps://example.com
.Perhatikan bahwa saya menggunakan HTTP aman. Ini menurut pendapat saya suatu keharusan untuk setiap layanan yang tersedia di tempat terbuka, karena informasi sensitif seperti kata sandi dan token otorisasi lewat antara klien dan server.
Otentikasi nama pengguna / kata sandi
Mari kita lihat cara kerja otentikasi lama yang sederhana terlebih dahulu.
https://example.com
https://example.com/api
untuk mendapatkan data spesifik pengguna untuk di-render di halaman. Setiap permintaan tunggal yang mereka kirim ke layanan web akan menyertakan nama pengguna dan kata sandi, mungkin dalam bentuk otentikasi HTTP Basic , karena layanan yang RESTful tidak diizinkan untuk mempertahankan status klien dari satu permintaan ke yang berikutnya. Karena layanan web menggunakan HTTP aman, kata sandi dienkripsi dengan aman selama transit.https://example.com/api
menerima banyak permintaan individu, masing-masing dengan informasi otentikasi. Nama pengguna dan kata sandi dalam setiap permintaan diperiksa terhadap basis data pengguna dan jika ditemukan benar, fungsi yang diminta dijalankan dan data dikembalikan ke klien dalam format JSON. Jika nama pengguna dan kata sandi tidak cocok dengan kesalahan dikirim ke klien dalam bentuk kode kesalahan HTTP 401.Poin penting yang diambil dari contoh ini adalah bahwa layanan web RESTful memerlukan otentikasi dengan setiap permintaan .
Lapisan keamanan tambahan dalam skenario ini akan menambahkan otorisasi aplikasi klien selain otentikasi pengguna. Misalnya, jika Anda memiliki aplikasi klien web, iOS dan Android semua menggunakan layanan web, Anda mungkin ingin server mengetahui mana dari ketiga klien dari permintaan yang diberikan, terlepas dari siapa pengguna yang diautentikasi. Ini dapat memungkinkan layanan web Anda untuk membatasi fungsi tertentu untuk klien tertentu. Untuk ini, Anda bisa menggunakan kunci API dan rahasia, lihat jawaban ini untuk beberapa ide tentang itu.
Otentikasi Facebook
Alur kerja di atas tidak berfungsi untuk koneksi Facebook karena login melalui Facebook memiliki pihak ketiga, Facebook sendiri. Prosedur masuk mengharuskan pengguna untuk diarahkan ke situs web Facebook di mana kredensial dimasukkan di luar kendali kami.
Jadi mari kita lihat bagaimana hal berubah:.
https://example.com
https://example.com/auth/facebook
.https://example.com/auth/facebook
rute ditangani oleh passport.js (lihat dokumentasi )https://example.com/auth/facebook/callback
https://example.com/auth/facebook/callback
rute akan memanggil fungsi panggilan balik yang menerima token akses Facebook dan beberapa informasi pengguna dari Facebook, termasuk alamat email pengguna.https://example.com/api
akan menyertakan token akses Facebook untuk otentikasi, atau token akses aplikasi sendiri yang dihasilkan dari token Facebook melalui fungsi "get_access_token" di REST API.Saya harap ini menjawab sebagian besar pertanyaan. Tentu saja Anda dapat mengganti Facebook dengan Twitter, Google, atau layanan otentikasi berbasis OAuth lainnya.
Saya akan tertarik untuk mengetahui apakah seseorang memiliki cara yang lebih sederhana untuk menghadapi ini.
sumber
Every single request they send to the web service will include the username and password
, namun Anda mengatakannyayou can have a "get_access_token" function in your RESTful service
. Tampaknya bertentangan untuk mengatakan bahwa REST perlu stateless, tetapi menyimpan sisi akses token server adalah OK, karena tindakan menyimpan token akses berarti bahwa server sekarang stateful. Saya akan sangat menghargai klarifikasi atau pembenaran tentang ini. Terima kasih! :)Saya sangat menghargai penjelasan @ Miguel dengan alur lengkap di setiap kasus, tetapi saya ingin menambahkan beberapa di bagian Otentikasi Facebook.
Facebook menyediakan Javascript SDK yang dapat Anda gunakan untuk mendapatkan token akses pada klien-akhir secara langsung, yang kemudian diteruskan ke server dan digunakan untuk menarik lebih lanjut semua informasi pengguna dari Facebook. Jadi Anda tidak perlu mengarahkan ulang pada dasarnya.
Selain itu, Anda juga dapat menggunakan titik akhir API yang sama untuk aplikasi seluler. Cukup gunakan Android / iOS SDK untuk Facebook, dapatkan Facebook access_token di sisi klien dan berikan ke server.
Mengenai sifat stateless seperti yang dijelaskan, ketika get_access_token digunakan untuk menghasilkan token dan diteruskan ke klien, token ini juga disimpan di server. Jadi sama baiknya dengan token sesi dan saya yakin ini membuatnya stateful?
Hanya 2 sen saya ..
sumber
Inilah artikel yang luar biasa yang saya temukan yang dapat membantu Anda mengautentikasi:
Otentikasi Node Mudah: Pengaturan dan Lokal
sumber