I'm mulai merancang sebuah REST web service, dan saya tidak jelas pada pendekatan yang terbaik untuk otentikasi. Layanan ini akan memungkinkan pengguna individu untuk mengakses/mengelola data mereka sendiri, sehingga beberapa jenis otentikasi pengguna diperlukan. I've telah melihat opsi ini:
OAuth tampaknya lebih tentang otorisasi, bukan dari otentikasi. Saya berencana untuk menangani otorisasi secara native dalam pelayanan, jadi saya tidak mencari solusi untuk ini. Tapi, ini OAuth juga sesuai untuk otentikasi?
OpenID pasti memberikan solusi untuk otentikasi, tapi ini lebih ditujukan untuk memungkinkan pengguna untuk menggunakan pihak ke-3 kredensial (Google, Yahoo, dll.) Meskipun saya ingin dukungan ini, ini bukan merupakan perhatian utama bagi saya, dan saya pasti akan memungkinkan pengguna untuk mendaftar dengan asli kredensial (email/password).
Ini adalah sederhana untuk melaksanakan, tetapi's pemahaman saya bahwa ini mungkin tidak akan menjadi sangat aman metode. Juga, tampaknya memerlukan pertukaran kredensial untuk akses masing-masing, tapi saya'd sukai bahwa pengguna melakukan otentikasi sekali dan kemudian melanjutkan akses melalui sesi token.
Pada dasarnya, roll saya sendiri login/token generasi layanan, dan memerlukan token yang valid untuk mengakses semua sumber daya lainnya (jelas, semuanya akan over SSL).
Serta menciptakan layanan web, saya'll juga akan membangun klien (web) aplikasi yang menggunakan layanan ini atas nama pengguna, tapi aku don't ingin aplikasi untuk menyimpan informasi pengguna/mandat/dll. Jadi, sesuatu seperti ini:
Pengguna (mengotentikasi dengan email/password atau pihak ke-3 kredensial) --> aplikasi Web (mengotentikasi dengan aplikasi ID) --> Web services
Dan lagi, aku ingin mengizinkan orang lain untuk membangun klien juga, jadi tingkat menengah dapat setiap aplikasi pihak ke-3:
Pengguna (mengotentikasi dengan email/password atau pihak ke-3 kredensial) --> aplikasi pihak ke-3 (mengotentikasi dengan aplikasi ID) --> Web services
Saya sangat top-level persyaratan:
Jadi, pertanyaan saya adalah, berdasarkan hal di atas (mohon beritahu saya jika ini terlalu samar-samar), apakah ada "terbaik" pendekatan? Yang OAuth atau OpenID yang tepat, atau saya membuat ini terlalu rumit, dan bukan hanya harus menggulung saya sendiri otentikasi?
EDIT:
Saya pikir saya akan perlu untuk mengimplementasikan berikut:
Asli surat mandat/token (HTTP basic auth atas SSL?)
Sebuah OpenID "Mengandalkan Pihak" untuk memungkinkan saya api untuk menggunakan OpenIDs host di tempat lain (yaitu, "dukungan untuk pihak ke-3 kredensial")
OAuth "Konsumen" untuk memungkinkan saya api untuk mengakses layanan pihak ke-3 (seperti mengakses pengguna's profil LinkedIn).
Sebuah OpenID "Penyedia" untuk memungkinkan orang untuk menggunakan api's asli Id di tempat lain (opsional)
OAuth "Penyedia" untuk memungkinkan aplikasi pihak ke-3 untuk mengakses api pada pengguna' nama (opsional)
Apakah ini tampak benar, atau saya membuat ini lebih rumit dari itu perlu?
Anda bisa mempertimbangkan JWT (JSON Web Token) lihat JWT rancangan rfc. Itu pasti akan memenuhi keamanan dan sesi tanggal kedaluwarsa persyaratan. Namun menjadi rancangan standar itu's tidak mungkin untuk digunakan secara luas sekarang ini bisa segera berubah sejak JWT adalah bagian dari OAuth 2.0. JWT yang mudah diterapkan dalam banyak bahasa dan terdapat beberapa perpustakaan yang sudah. Sebagai penjelasan sederhana, yang JWT token terdiri dari 3 bagian , yaitu header , body dan tanda tangan. Header dan tubuh adalah objek json yang basee64url dikodekan (huruf berbeda dari base64 oleh 2 karakter terakhir) dan kemudian menandatangani kontrak dengan HMAC256 (atau algoritma lain yang ditentukan dalam header) RFC menjelaskan bagaimana untuk benar-benar menghasilkan tanda tangan ini. Anda mungkin ingin memeriksa ini online token generator.
JWT adalah header http dan parameter kueri yang ramah.
Salah satu pilihan yang baik untuk mempertimbangkan adalah 'Shared key Authentication'. Ini adalah jenis otentikasi bahwa Amazon web service dan Windows Azure Storage menggunakan layanan. Kami telah menggunakan Shared Key Authentication di SELURUH layanan yang kami kembangkan. Anda dapat melakukan pencarian cepat di Google untuk 'Shared Key authentication' anda akan mendapatkan banyak rincian.
Saya menulis satu posting blog di sini tentang hal ini.
Langkah tingkat tinggi adalah:
Saran saya adalah untuk mengotentikasi permintaan pertama dan kemudian mengatur sesi token.
Front-end aplikasi akan menyimpan token dan memberikan itu dengan setiap permintaan berikutnya.
Token akan memiliki waktu kadaluarsa. Token akan hangus jika tidak digunakan untuk periode waktu tertentu.
Token dapat dikaitkan dengan alamat IP asal untuk keamanan tambahan.
Token dapat ditularkan sebagai cookie, atau sebagai salah satu dari query parameter dalam URL.
Jika repot-repot SSL otentikasi klien dapat diterima, anda bisa menggunakan saling otentikasi SSL. Setiap klien harus ditetapkan dengan sertifikat yang percaya server. Hal ini dapat sama sertifikat, atau sertifikat yang berbeda jika anda harus memperlakukan klien yang berbeda.
Berdasarkan pada kebutuhan anda saya pikir OAuth 2.0
mungkin benar-benar menjadi pilihan yang menarik. OAuth adalah memang otorisasi protokol, tetapi juga Mengesahkan
klien dengan clientId
dan clientSecret
. Anda dapat menggunakan Klien Credential Aliran
dan memilih untuk tidak menyertakan Refresh Token
, dengan cara ini pengguna memiliki Akses Token`, yang berakhir setelah jumlah waktu tertentu. Dan sejak OAuth adalah banyak digunakan protokol mereka sudah banyak client dan sisi server perpustakaan untuk anda dan klien anda untuk menggunakan.
Jika anda berpikir OAuth terlalu berat atau terlalu rumit untuk aplikasi anda saya mungkin akan tetap dengan Otentikasi Dasar
atas HTTPS
. Tapi karena saya juga dinyatakan dalam jawaban lain untuk pertanyaan serupa, saya tidak akan pernah menemukan saya sendiri mekanisme otentikasi.
Untuk info lebih lanjut anda juga dapat melihat jawaban lain saya've diberikan sebelumnya untuk pertanyaan serupa: https://stackoverflow.com/a/15003777/849741
I've dilaksanakan dan dirilis sebagai open source layanan dasar yang memungkinkan otentikasi, dapat dengan mudah diubah untuk memungkinkan 3-tupel login jika diperlukan. Ini adalah sekitar 2 tahun dan ditulis di Jawa selama musim Semi sehingga anda mungkin ingin untuk mempertimbangkan kembali teknologi, tetapi bekerja dan anda bisa mendapatkan ide dasar tentang bagaimana it's dilakukan. Menemukan hal di sini di google, atau mengikuti my blog tentang hal itu. Perhatikan bahwa aplikasi tidak lagi beban di cloudbees tapi jika anda memasangnya di akun anda semua harus ok.
Anda bisa menggunakan HTTP Basic Auth, di mana ditransfer password tidak benar-benar password tapi tanda, bahwa klien yang diperoleh pada sumber daya yang berbeda permintaan, di mana ia/dia/itu harus memberikan/nya/password sekali dan hanya sekali (bahkan mungkin lebih dari saluran yang berbeda). Ini tidak aman man-in-the-middle attacks (seperti yang ada's tidak pesan masuk), tetapi gagasan adalah bahwa anda selalu dapat meminta klien untuk menghasilkan dinamis token entah bagaimana (yaitu pada auth layanan anda sendiri) dan kemudian harus mengirim token sebagai pengganti password, sehingga password yang sebenarnya tidak terus-menerus ditransfer melalui kawat. Ya, hal ini tampaknya seperti salah satu "custom auth solusi", tapi itu benar-benar isn't karena anda bisa memaksakan apa yang pernah aturan yang anda inginkan pada token-password, seperti menggunakan tanda tangan tanda sebagai password itu adalah sesi yang terikat atau dihitung kembali pada setiap permintaan (tanpa berbagi rahasia) sehingga server dapat memvalidasi pesan - apa pun kebutuhan anda. idenya adalah untuk mengirim validasi token sebagai "password" HTTP Basic Auth permintaan dan tidak bergantung pada yang lebih rumit protokol, sementara tidak berkuasa mereka keluar (untuk pilihan anda).
Saya sarankan menggunakan Semi Boot untuk layanan web Tenang karena anda dapat menggunakan mereka musim Semi Keamanan untuk menerapkan otentikasi kustom anda sendiri berdasarkan template. Anda dapat menerapkan anda sendiri kustom otentikasi dengan memperluas atau menerapkan basis mereka keamanan kelas dan interface masing-masing. Anda juga memiliki pilihan untuk menggabungkan orang-orang lain auth mekanisme anda've tercantum di musim Semi Boot jika diperlukan.
OAuth 2.0 adalah cara untuk pergi jika anda hanya membutuhkan otorisasi.Anda bisa menggunakan OpenID Connect, yang menyediakan otentikasi dan mendukung OAuth2.0 untuk otorisasi. Untuk OepnID Connect, ada banyak produk-produk bersertifikat tersedia jika anda perlu untuk setup layanan sendiri, ada banyak layanan online yang tersedia juga.