Bagaimana saya harus merancang layanan web RESTful untuk menggunakan pihak ke-3 (yaitu Google, Facebook, Twitter) untuk otentikasi?


25

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?


tidak ada yang salah dengan apa yang Anda sarankan. saya merasa lebih mudah untuk melihat contoh kode integrasi openid daripada spesifikasi oauth dan openid yang sebenarnya ...
angkasawan

Bahasa / platform apa yang Anda gunakan? Anda tidak perlu menemukan kembali roda, karena ada kerangka kerja yang secara substansial membantu Anda. :)
RobM

@Rob Layanan web di-host di Salesforce.com, tetapi diakses melalui proxy yang pada penulisan ini adalah Node.js. Yang mengatakan sepertinya pertanyaan umum akan berlaku untuk semua platform. Dan ya, saya berharap menggunakan kerangka daripada menciptakan kembali roda, hanya saja tidak yakin roda apa yang digunakan.
Ralph Callaway

@Ralph Yep, pertanyaan umum adalah terlepas dari platform, tetapi memiliki implikasi praktis, karena platform umumnya akan mempersempit opsi kerangka kerja Anda sedikit. Jadi, Anda punya aplikasi front-end yang dibuat khusus menggunakan node.js ke layanan web & repositori yang di-host oleh tenaga penjualan? Apakah Anda perlu menyimpan informasi pengguna / identitas di backend, atau hanya otentikasi dan otorisasi pada tindakan di front-end?
RobM

@RobM ya, kami ingin menyimpan informasi pengguna di backend, yaitu email, nama depan, nama belakang, ditambah apa pun yang diperlukan untuk memvalidasi panggilan di masa mendatang dari konsumen layanan web setelah mereka diautentikasi.
Ralph Callaway

Jawaban:


14

Sepertinya ada dua tujuan:

  1. Mudah bagi pengguna akhir untuk mengautentikasi dengan akun sosial mereka yang ada
  2. Mudah bagi pengembang menggunakan layanan web Anda

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:

masukkan deskripsi gambar di sini

Bisakah kita menyebutnya oauth2-piggy-back?

Langkah demi langkah mengalir

  1. Situs kunjungan pengguna akhir yang menggunakan API Anda
  2. Pengguna akhir dikirim ke situs Anda untuk mengotorisasi atau mendaftar (oauth2)
  3. Pengguna akhir memilih autent sosial, klik tombol login facebook
  4. Situs Anda menetapkan cookie atau menyetel statedi facebook untuk mengetahui dari mana pengguna berasal
  5. Pengguna akhir dialihkan ke Facebook dan menerima koneksi di situs facebook
  6. Pengguna akhir diarahkan ke situs Anda untuk menyelesaikan proses autentikasi facebook
  7. Anda mencari atau membuat pengguna di basis data Anda
  8. Anda membuat sesi baru di server Anda
  9. Anda mengarahkan pengguna kembali ke situs aslinya dengan token sesi Anda

5

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.


1

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.


1

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:

  • Banyak login: Apa yang terjadi jika saya masuk dengan akun Facebook saya suatu hari dan akun Google saya di hari berikutnya? Atau secara bersamaan? Apakah Anda memperlakukan kedua akun ini sebagai akun unik dan terpisah atau haruskah Anda memiliki beberapa metode untuk mengaitkan keduanya dan mengizinkan saya untuk mengakses tiket saya dengan cara apa pun?
  • Mengandalkan pengidentifikasi eksternal: Apa yang terjadi ketika Facebook atau Twitter memutuskan untuk mengubah cara pengidentifikasi akun mereka? Sebagai ilustrasi, jika BazLogin mewakili akun unik menggunakan kode {4382-af56} tetapi memutuskan bahwa mulai sekarang akun akan memiliki 12 digit karena 8 tidak cukup, bagaimana Anda memberi tahu {1234-4382-af56} dari {0000-4382 -af56}?

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.