Saya tidak tahu apakah saya hanya memiliki semacam blind spot atau apa, tetapi saya telah membaca spec OAuth 2 berkali-kali dan membaca arsip milis, dan saya belum menemukan penjelasan yang baik tentang mengapa Hibah Implisit aliran untuk mendapatkan token akses telah dikembangkan. Dibandingkan dengan Hibah Kode Otorisasi, tampaknya hanya menyerah pada otentikasi klien tanpa alasan yang sangat menarik. Bagaimana ini "dioptimalkan untuk klien diimplementasikan dalam browser menggunakan bahasa scripting" (mengutip spesifikasi)?
Kedua aliran memulai sama (sumber: http://tools.ietf.org/html/draft-ietf-oauth-v2-22 ):
- Klien memulai alur dengan mengarahkan agen pengguna pemilik sumber daya ke titik akhir otorisasi.
- Server otorisasi mengotentikasi pemilik sumber daya (melalui agen-pengguna) dan menetapkan apakah pemilik sumber daya mengabulkan atau menolak permintaan akses klien.
- Dengan asumsi pemilik sumber daya memberikan akses, server otorisasi mengarahkan kembali agen-pengguna kembali ke klien menggunakan pengalihan URI yang disediakan sebelumnya (dalam permintaan atau selama pendaftaran klien).
- URI pengalihan termasuk kode otorisasi (Alur kode otorisasi)
- URI pengalihan mencakup token akses dalam fragmen URI (Aliran implisit)
Di sinilah arus terbagi. Dalam kedua kasus, pengalihan URI pada titik ini adalah ke beberapa titik akhir yang dihosting oleh klien:
- Dalam aliran kode Otorisasi, ketika agen pengguna mencapai titik akhir itu dengan kode Otorisasi di URI, kode pada titik tersebut menukar kode otorisasi bersama dengan kredensial kliennya untuk token akses yang kemudian dapat digunakan sesuai kebutuhan. Misalnya, dapat menulisnya ke halaman web yang dapat diakses oleh skrip pada halaman tersebut.
- Aliran implisit melewatkan langkah otentikasi klien ini dan hanya memuat halaman web dengan skrip klien. Ada trik lucu di sini dengan fragmen URL yang membuat token akses tidak terlalu banyak dibagikan, tetapi hasil akhirnya pada dasarnya sama: situs yang dihosting klien menyajikan halaman dengan beberapa skrip di dalamnya yang dapat mengambil token akses .
Maka pertanyaan saya: apa yang telah diperoleh di sini dengan melewatkan langkah otentikasi klien?
sumber
Jawaban:
Inilah pikiran saya:
Tujuan dari kode auth + token dalam aliran kode otorisasi adalah bahwa token dan rahasia klien tidak akan pernah terpapar ke pemilik sumber daya karena mereka melakukan perjalanan server-ke-server.
Di sisi lain, aliran hibah implisit adalah untuk klien yang sepenuhnya diimplementasikan menggunakan javascript dan berjalan di browser pemilik sumber daya. Anda tidak memerlukan kode sisi server apa pun untuk menggunakan alur ini. Kemudian, jika semuanya terjadi di browser pemilik sumber daya, tidak masuk akal untuk mengeluarkan kode auth & rahasia klien lagi, karena token & rahasia klien masih akan dibagikan dengan pemilik sumber daya. Termasuk kode auth & rahasia klien hanya membuat aliran lebih rumit tanpa menambahkan keamanan yang lebih nyata.
Jadi jawaban atas "apa yang telah diperoleh?" adalah "kesederhanaan".
sumber
Auth code
, bersama-sama denganclient_id
danclient_secret
digunakan untuk mengidentifikasi klien tepercaya yang dapat menyegarkan token untuk login lama dan untuk "login offline" . Namun dalam aplikasi sisi klien, tidak ada cara untuk mendaftarkan setiap klien, maka jenis hibah implisit "disederhanakan" untuk akses sementara ke informasi penggunaItu ada untuk alasan keamanan, bukan untuk kesederhanaan.
Anda harus mempertimbangkan perbedaan antara agen pengguna dan klien :
Agen-pengguna adalah perangkat lunak di mana pengguna ("pemilik sumber") berkomunikasi dengan bagian lain dari sistem (server otentikasi dan server sumber daya).
Klien adalah perangkat lunak yang ingin mengakses sumber daya pengguna di server sumber daya.
Dalam kasus agen-pengguna yang dipisahkan dan klien, Hibah Kode Otorisasi masuk akal. Misalnya pengguna menggunakan browser web (agen pengguna) untuk login dengan akun Facebooknya di Kickstarter. Dalam hal ini klien adalah salah satu server Kickstarter, yang menangani login pengguna. Server ini mendapatkan token akses dan token penyegaran dari Facebook. Jadi jenis klien ini dianggap "aman", karena akses terbatas, token dapat disimpan dan Kickstarter dapat mengakses sumber daya pengguna dan bahkan menyegarkan token akses tanpa interaksi pengguna.
Jika agen-pengguna dan klien digabungkan (misalnya aplikasi seluler asli, aplikasi javascript), Alur Kerja Otorisasi Tersirat dapat diterapkan. Itu bergantung pada kehadiran pemilik sumber daya (untuk memasukkan kredensial) dan tidak mendukung token penyegaran. Jika klien ini menyimpan token akses untuk digunakan nanti, itu akan menjadi masalah keamanan, karena token dapat dengan mudah diekstraksi oleh aplikasi lain atau pengguna klien. Tidak adanya token penyegaran merupakan petunjuk tambahan, bahwa metode ini tidak dirancang untuk mengakses sumber daya pengguna tanpa adanya pengguna.
sumber
Penjelasan yang biasa adalah bahwa hibah implisit lebih mudah diterapkan ketika Anda menggunakan klien JavaScript. Tapi saya pikir ini cara yang salah untuk melihatnya. Jika Anda menggunakan klien JavaScript yang meminta sumber daya yang dilindungi secara langsung melalui XMLHttpRequest, hibah implisit adalah satu-satunya pilihan Anda, meskipun kurang aman. *
Hibah Kode Otorisasi memberikan keamanan tambahan, tetapi hanya berfungsi ketika Anda memiliki server web yang meminta sumber daya yang dilindungi. Karena server web dapat menyimpan token akses, Anda menjalankan lebih sedikit risiko token akses yang terekspos ke Internet, dan Anda dapat mengeluarkan token yang tahan lama. Dan karena server web tepercaya, ia dapat diberi "token penyegaran", sehingga bisa mendapatkan token akses baru ketika yang lama kedaluwarsa.
Tapi - dan ini adalah hal yang mudah dilewatkan - keamanan aliran kode Otorisasi hanya berfungsi jika server web dilindungi dengan sesi, yang dibuat dengan otentikasi pengguna (login). Tanpa sesi, pengguna yang tidak dipercaya bisa membuat permintaan ke server web, menggunakan client_id, dan itu akan sama seperti jika pengguna memiliki token akses. Menambahkan sesi berarti bahwa hanya pengguna yang diautentikasi yang dapat mengakses sumber daya yang dilindungi. Client_id hanyalah "identitas" dari webapp JS, bukan otentikasi dari webapp tersebut.
Ini juga berarti bahwa Anda dapat mengakhiri sesi sebelum token OAuth berakhir. Tidak ada cara standar untuk membatalkan token akses. Tetapi jika sesi Anda berakhir, token akses tidak berguna, karena tidak ada yang tahu kecuali server web. Jika pengguna yang tidak dipercaya mendapatkan akses ke kunci sesi Anda, mereka hanya akan dapat mengakses sumber daya yang dilindungi selama sesi itu valid.
Jika tidak ada server web, Anda harus menggunakan hibah Tersirat. Tetapi ini berarti bahwa token akses terpapar ke Internet. Jika pengguna yang tidak dipercaya mendapatkan akses ke sana, mereka dapat menggunakannya sampai habis masa berlakunya. Ini berarti mereka akan memiliki akses lebih lama daripada dengan hibah Kode Otorisasi. Jadi, Anda mungkin ingin mempertimbangkan untuk membuat token lebih cepat berakhir, dan menghindari memberikan akses ke sumber daya yang lebih sensitif.
* EDIT: Baru-baru ini, orang merekomendasikan agar Anda tidak menggunakan hibah Implisit, bahkan pada aplikasi web tanpa server. Alih-alih, Anda dapat menggunakan hibah Kode Otorisasi yang dikonfigurasi dengan rahasia kosong, bersama dengan PKCE. Pemberian kode autentik menghindari penyimpanan token akses dalam riwayat browser Anda, dan PKCE menghindarinya jika seseorang membajak URL pengalihan untuk mencuri kode auth. Dalam hal ini Anda perlu server untuk menghindari pengembalian token penyegaran, karena klien Anda mungkin tidak dapat menyimpannya dengan aman. Dan itu harus mengeluarkan token akses dengan batasan yang sama yang disebutkan di atas.
sumber
Itu bermuara pada: Jika pengguna menjalankan aplikasi web berbasis, atau "publik", JavaScript tanpa komponen sisi server, maka pengguna secara implisit mempercayai aplikasi (dan browser tempat aplikasi berjalan, berpotensi dengan browser lain aplikasi berbasis ...).
Tidak ada server jarak jauh pihak ke-3, hanya server sumber daya. Tidak ada manfaat untuk kode otorisasi, karena tidak ada agen lain selain browser yang bertindak atas nama pengguna. Tidak ada manfaat untuk kredensial klien karena alasan yang sama. ( Setiap klien dapat mencoba untuk menggunakan aliran ini.)
Namun, implikasi keamanannya penting. Dari http://tools.ietf.org/html/rfc6749#section-10.3 :
Dari http://tools.ietf.org/html/rfc6749#section-10.16 :
sumber
Saya tidak yakin saya mengerti dengan benar jawaban dan komentar Dan. Tampaknya bagi saya bahwa jawabannya telah menyatakan beberapa fakta yang benar tetapi itu menunjukkan dengan tepat apa yang ditanyakan OP. Jika saya mengerti dengan benar, keuntungan utama dari aliran hibah implisit adalah bahwa klien seperti aplikasi JS (mis. Ekstensi Chrome) tidak harus membuka rahasia klien.
Dan Taflin berkata:
Mungkin saya salah paham dengan Anda, tetapi klien (aplikasi JS dalam kasus ini) harus menyerahkan kredensial klien (kunci dan rahasia klien) ke server sumber daya dalam aliran kode otorisasi, bukan? Rahasia klien tidak dapat "disimpan dari JS".
sumber
Sementara Hibah Implisit dirancang untuk mendukung aplikasi yang tidak dapat melindungi rahasia klien termasuk aplikasi JavaScript sisi klien, beberapa penyedia menerapkan alternatif menggunakan Kode Otorisasi tanpa Rahasia Klien. OAuth 2.0 IETF RFC-6749 diterbitkan pada 2012 dan rekomendasi saat ini beberapa diskusi baru-baru ini berasal dari 2017.
Diskusi 2017 tentang milis IETF OAuth tersedia dari para pelaksana ini:
Baca lebih lanjut di sini:
Pindah ke Kode Auth tanpa Rahasia Klien dari Implicit Grant juga disebutkan untuk aplikasi seluler di sini:
sumber
selain jawaban lain, penting juga untuk menyadari bahwa profil Implisit memungkinkan aliran saluran-depan hanya berlawanan dengan aliran Kode Otorisasi yang memerlukan panggilan kembali ke Server Otorisasi; ini menjadi jelas dalam OpenID Connect yang merupakan protokol SSO yang dibangun di atas Auth 2.0 di mana aliran implisit menyerupai SAML POST mengikat cukup populer dan aliran Kode Otorisasi menyerupai SAML Artifact mengikat kurang diterapkan
sumber
Dalam aliran implisit jika browser pengguna rusak (ekstensi jahat / virus) maka korupsi mendapatkan akses ke sumber daya pengguna dan dapat melakukan hal-hal buruk.
Dalam auth flow, korupsi tidak bisa karena tidak tahu rahasia klien.
sumber
https://tools.ietf.org/html/rfc6749#page-8
sumber
Saya pikir Will Cain menjawab ini ketika dia berkata, "Tidak ada manfaat bagi kredensial klien untuk alasan yang sama. (Klien mana pun dapat mencoba menggunakan aliran ini.)" Juga pertimbangkan bahwa redirect_uri untuk aliran implisit mungkin "localhost" - tidak ada panggilan balik dibuat dari Server Otorisasi untuk aliran implisit. Karena tidak ada cara untuk mempercayai klien, pengguna harus menyetujui pelepasan klaim pengguna.
sumber
Hibah Implisit memungkinkan untuk memperoleh token dari Titik Akhir Otorisasi dengan a
GET
. Ini berarti server otorisasi tidak harus mendukung CORS.Jika itu bukan masalah dan tidak ada masalah lain yang terkait dengan server otorisasi tidak fleksibel (mis. Token penyegaran tidak opsional, untuk beberapa alasan) maka aliran kode otorisasi adalah yang lebih disukai, bahkan untuk klien publik, sesuai dengan tren industri terkini dan setidaknya contoh (saat ini) dari draft resmi .
Secara historis ada alasan lain untuk menerapkan aliran implisit tetapi tampaknya mereka saat ini lebih besar daripada manfaat keamanan yang diberikan oleh kode otorisasi, termasuk:
sumber
Saya baru saja dihadapkan dengan beberapa artikel tentang OAuth 2.0. Penulis menyatakan bahwa alasan di balik aliran Implisit adalah bahwa aplikasi JS sangat terbatas dalam permintaan di sana:
https://medium.com/securing/what-is-going-on-with-oauth-2-0-and-why-you-should-not-use-use-it-for-authentication-5f47597b2611
sumber