Untuk pekerjaan saya, kami memiliki layanan web tenang bagus yang kami bangun yang kami gunakan untuk mengarahkan beberapa situs web yang kami miliki. Pada dasarnya layanan web memungkinkan Anda membuat dan bekerja dengan tiket dukungan, dan situs web bertanggung jawab atas ujung depan. Setiap permintaan layanan web menggunakan tajuk auth yang kami gunakan untuk memvalidasi pengguna dan kata sandi mereka untuk setiap panggilan.
Tahun ini kami ingin memperluas opsi masuk kami sehingga pengguna di situs web dapat masuk melalui Google, Twitter, dan Facebook (mungkin yang lain). Namun saya memiliki banyak masalah mencari cara untuk merancang ini sehingga layanan web dapat menggunakan penyedia otentikasi pihak ke-3 untuk memastikan pengguna adalah yang mereka katakan. Apakah ada praktik terbaik di luar sana untuk bagaimana melakukan ini?
Saat ini kami berpikir untuk memiliki situs web yang menangani otentikasi pengguna sendiri, dan kemudian menggunakan panggilan setSessionId baru yang mendaftarkan sesi mereka saat ini dengan layanan web back end. Setiap permintaan tambahan untuk layanan web akan melewati sessionId itu dan akan memvalidasinya. Ini sepertinya baik-baik saja, tetapi saya merasa di belakang kepala saya bahwa saya tidak memikirkan ini dan semua forum saya browsing dan membaca spesifikasi oauth dan openid hanya membuat saya lebih bingung. Adakah kiat untuk mengatasi ini?
sumber
Jawaban:
Sepertinya ada dua tujuan:
Otorisasi orang untuk menggunakan sumber daya di situs Anda menjadikan OAuth2 mekanisme yang disukai karena popularitas dan ketersediaan pustaka klien.
1. Mudah bagi pengguna akhir untuk mengautentikasi dengan akun sosial yang ada
Pengguna akhir mengunjungi situs yang menggunakan API Anda dan memilih untuk masuk. Mereka dikirim ke halaman login OAuth Anda. Halaman login Anda menunjukkan prompt nama pengguna dan kata sandi yang normal untuk akun yang dikelola di situs Anda dan serangkaian tombol auth sosial di mana mereka dapat mengklik untuk masuk melalui situs seperti Facebook. Ketika pengguna memilih Facebook, Anda mengarahkan mereka ke Facebook untuk menyetujui pilihan (memulai aliran autentikasi facebook). Ketika pengguna akhir menyelesaikan login di Facebook, mereka akan diarahkan kembali ke situs Anda.
Ketika pengguna diarahkan kembali ke situs Anda dari Facebook, Anda menyimpan informasi pengguna itu ke dalam catatan pengguna dalam database Anda dan kemudian menghasilkan sesi baru untuk pengguna itu. Anda segera mengarahkan pengguna akhir ke situs downstream asli mereka dengan oauth access_token, menyelesaikan aliran oauth asli.
2. Mudah bagi pengembang menggunakan layanan web Anda
Jika Anda adalah penyedia otorisasi, maka Anda harus membuat antarmuka sederhana untuk bergantung pada pengembang yang tidak berubah setiap kali Anda menambahkan penyedia auth upstream baru yang tidak menerapkan oauth dengan sempurna. Inilah mengapa saya percaya Anda harus mengimplementasikan situs penyedia OAuth2 dan situs itu harus menjadi konsumen situs auth sosial.
Untuk pengembang yang menggunakan API istirahat Anda yang bagus, mereka tidak akan mengetahui interaksi Facebook kecuali Anda memilih untuk memberi mereka petunjuk melalui pos penangkapan sesi (misalnya).
TL; DR
Jadikan konsumen API Anda seperti Anda dengan menerapkan OAuth2 dan menyembunyikan kerumitan auth sosial. Anda dapat, selama aliran oauth untuk situs hilir Anda, memicu aliran oauth tambahan dengan facebook.
Gambar karena gambar == kata * 1000:
Bisakah kita menyebutnya oauth2-piggy-back?
Langkah demi langkah mengalir
state
di facebook untuk mengetahui dari mana pengguna berasalsumber
Cara membuatnya bisa diperluas
Pertama, Anda harus memperhatikan semua api ini menggunakan mekanisme yang sama untuk masuk. Mereka semua menggunakan OAuth untuk otentikasi mereka. Ini Anda perlu memanfaatkan dengan mulai dengan perpustakaan OAuth umum. Jangan gunakan perpustakaan mereka sendiri untuk otentikasi, ini tidak akan dapat digunakan untuk penyedia lain. Jika Anda memahami OAuth2, cukup mudah untuk menambahkan lebih banyak penyedia.
Sayangnya, Anda perlu dua dari mereka, karena twitter masih belum ikut-ikutan OAuth2.
OAuth mengharuskan Anda membuat antarmuka untuk pesta autentikasi. Token akan ditukar server ke server. Buat satu titik masuk, yang dapat menangani semua komunikasi.
Token harus disimpan dalam tabel terpisah dari akun Anda, ini karena mereka dapat berupa beberapa token dan beberapa profil tertaut. Beberapa layanan memberi Anda dua token, salah satunya adalah token penyegaran.
Sekarang Anda merancang antarmuka, yang merangkum fungsi lain yang Anda butuhkan. Saya pribadi akan menyiapkan layanan REST terpisah untuk ini. Dengan cara ini Anda dapat dengan mudah memperluas otentikasi ke tempat lain.
Beberapa layanan menggunakan JSON untuk berkomunikasi, lainnya menggunakan XML dll. Untuk pengguna depan, Anda perlu menyatukan semuanya. Ini adalah proses yang cukup menyakitkan, tetapi dimungkinkan untuk mendapatkan beberapa alasan umum di sini.
Masalah lain di sini, adalah tidak semua layanan menyediakan fungsionalitas yang sama. Ini dapat berarti, bahwa layanan Anda tidak dapat menyediakan API lengkap seperti yang Anda tentukan. Anda perlu memiliki strategi di sini, yang memungkinkan aplikasi menurunkan versi dengan anggun.
Ini semua akan memastikan Anda dapat dengan mudah menambahkan penyedia pihak ke-3 yang baru.
Masalah token
Token dibatasi dalam waktu, sehingga Anda memerlukan beberapa pekerjaan cron, yang dapat memeriksa apakah token masih dapat digunakan, jika tidak Anda harus menghapusnya. Anda juga dapat menyegarkan token dengan mekanisme ini.
Kadang-kadang terjadi, bahwa pengguna menarik token. Bersiaplah untuk ini.
Penyimpanan data
Jika Anda memiliki desain ini, Anda perlu memikirkan data yang Anda butuhkan. Ini mengikuti sebagian dari antarmuka yang baru Anda buat. Desain beberapa tabel untuk ini dan lihat apakah datanya benar-benar dapat diambil. Beberapa layanan tidak membiarkan Anda mengambil banyak data. Anda juga harus mempertimbangkan, bahwa semakin banyak data yang Anda butuhkan, semakin berat pesan privasi itu. Jadi bersikaplah sederhana dalam kebutuhan Anda, jika tidak, pengguna tidak akan menggunakannya.
Untuk verifikasi tambahan, Anda dapat menyimpan profil dalam tabel terpisah, tetapi tertaut dengan pengguna Anda. Ini akan memberi Anda lebih banyak informasi tentang seseorang.
Periksa juga undang-undang setempat Anda, untuk beberapa data Anda perlu tindakan pencegahan ekstra.
Hal terakhir. Jangan membuat kesalahan di mana Anda tidak membuat akun di layanan Anda sendiri. Jika pengguna dicekal dari Facebook, ia secara efektif tidak akan bisa masuk ke layanan Anda. Ini adalah situasi yang tidak ingin Anda ciptakan. Ini sering diabaikan.
sumber
Saya pasti akan menggunakan solusi yang sepertinya sudah Anda ketahui: menerapkan otentikasi pihak ke-3 di situs web yang menghadap klien dan kemudian mengaitkan token auth pihak ke-3 itu dengan akun pengguna situs web Anda, dan akhirnya memicu panggilan setSessionID Anda masuk.
Bergantung pada arsitektur situs web Anda, Anda mungkin menemukan menggunakan perpustakaan seperti EveryAuth atau Passport sangat membantu.
sumber
Dua sen saya: Saya belum pernah melakukan hal seperti ini sebelumnya dan saya juga tidak tahu bagaimana mekanisme login FB, Twitter atau Google, tetapi beberapa masalah muncul di kepala saya segera setelah saya membaca pertanyaan Anda:
Kami dapat menangani dua masalah ini dengan memilih untuk mengaitkan akun eksternal dengan akun internal, bukan hanya ID sesi. Kemudian, login eksternal bisa menjadi gerbang menuju pembuatan akun internal. Jika saya mengautentikasi dengan lebih dari satu metode login, Anda dapat memberi tahu saya bahwa saya sudah masuk. Jika penyedia auth eksternal mengubah sesuatu yang kami andalkan, kami dapat meminta pengguna untuk memberikan nama dan kata sandi akun internal mereka dan membuat asosiasi baru untuk login mendatang.
Saya tidak yakin saya membahas masalah yang ada dalam pikiran Anda, tetapi Anda tidak benar-benar menyebutkan masalah nyata. Saya harap jawaban saya sangat membantu.
sumber