Dengan aliran "Tersirat", klien (kemungkinan peramban) akan mendapatkan token akses, setelah Pemilik Sumber Daya (yaitu pengguna) memberikan akses.
Namun dengan aliran "Kode Otorisasi", klien (biasanya server web) hanya mendapatkan kode otorisasi setelah Pemilik Sumber Daya (yaitu pengguna) memberikan akses. Dengan kode otorisasi itu, klien kemudian melakukan panggilan lain ke API yang meneruskan client_id dan client_secret bersama dengan kode otorisasi untuk mendapatkan token akses. Semua dijelaskan dengan baik di sini .
Kedua aliran memiliki hasil yang sama persis: token akses. Namun, aliran "Tersirat" jauh lebih sederhana.
Pertanyaannya: Mengapa repot-repot dengan "Kode Otorisasi" mengalir, ketika aliran "Implisit" terlihat baik-baik saja? Mengapa tidak menggunakan "Implisit" untuk server web?
Lebih banyak pekerjaan untuk penyedia dan klien.
sumber
Jawaban:
tl; dr: Ini semua karena alasan keamanan.
OAuth 2.0 ingin memenuhi dua kriteria ini:
Detail di bawah:
Aliran implisit hanya mungkin di lingkungan browser karena alasan keamanan:
Dalam aliran implisit token akses dilewatkan secara langsung sebagai fragmen hash (bukan sebagai parameter URL). Satu hal penting tentang fragmen hash adalah bahwa, setelah Anda mengikuti tautan yang berisi fragmen hash, hanya browser yang mengetahui fragmen hash. Browser akan meneruskan fragmen hash langsung ke halaman web tujuan (URI redirect / halaman web klien). Hash fragment memiliki sifat-sifat berikut:
Ini memungkinkan untuk melewatkan Token Akses langsung ke klien tanpa risiko diinterupsi oleh server perantara. Ini memiliki peringatan hanya menjadi sisi klien yang mungkin dan perlu javascript menjalankan sisi klien untuk menggunakan token akses.
Aliran implisit juga memiliki masalah keamanan yang memerlukan logika lebih lanjut untuk menyelesaikan / menghindari misalnya:
Dalam aliran kode otorisasi tidak mungkin untuk melewatkan token akses secara langsung dalam parameter URL karena parameter URL adalah bagian dari Permintaan HTTP, oleh karena itu setiap server perantara / router tempat permintaan Anda akan melewati (bisa ratusan) dapat baca token akses jika Anda tidak menggunakan koneksi terenkripsi (HTTPS) yang memungkinkan apa yang dikenal sebagai serangan Man-in-the-middle.
Melewati token akses secara langsung dalam param URL dapat secara teori dimungkinkan tetapi auth sever harus memastikan URI redirect menggunakan HTTPS dengan enkripsi TLS dan sertifikat SSL 'tepercaya' (biasanya dari Otoritas Sertifikat yang tidak gratis) untuk memastikan bahwa server tujuan sah dan bahwa permintaan HTTP sepenuhnya terenkripsi. Memiliki semua pengembang membeli sertifikat SSL dan mengkonfigurasi SSL dengan benar di domain mereka akan sangat menyusahkan dan akan memperlambat adopsi. Inilah sebabnya mengapa "kode otorisasi" perantara sekali pakai diberikan asalkan hanya penerima yang sah yang dapat bertukar (karena Anda memerlukan rahasia klien) dan bahwa kode tersebut tidak akan berguna bagi peretas potensial yang mencegat permintaan atas transaksi yang tidak dienkripsi. (karena mereka tidak
Anda juga bisa berpendapat bahwa aliran implisit kurang aman, ada vektor serangan potensial seperti spoofing domain saat pengalihan - misalnya dengan membajak alamat IP situs web klien. Ini adalah salah satu alasan mengapa aliran implisit hanya memberikan token akses (yang seharusnya memiliki waktu penggunaan terbatas) dan tidak pernah me-refresh token (yang tidak terbatas waktu). Untuk memperbaiki masalah ini, saya menyarankan Anda untuk meng-host halaman web Anda di server yang mendukung HTTPS bila memungkinkan.
sumber
Auth Code
berpotensi dikirim secara jelas melalui HTTP. TetapiAuth Code
tidak ada gunanya tanpa ID klien / Rahasia. Pada dasarnya inti dari aliran Kode OAuth adalah bahwa beban memiliki server yang mendukung SSL ada pada Penyedia OAuth (Google / Facebook dll ...) dan bukan pada pengguna API (Anda, saya).The Implisit Aliran membuat seluruh aliran cukup mudah, tetapi juga kurang aman .
Karena aplikasi klien, yang biasanya JavaScript yang berjalan di dalam Browser kurang tepercaya, tidak ada token penyegaran untuk akses jangka panjang yang dikembalikan.
Anda harus menggunakan aliran ini untuk aplikasi yang memerlukan akses sementara (beberapa jam) ke data pengguna.
Mengembalikan token akses ke klien JavaScript juga berarti bahwa aplikasi berbasis browser Anda harus berhati-hati - pikirkan XSS Attacks yang dapat membocorkan token akses ke sistem lain.
https://labs.hybris.com/2012/06/05/oauth2-the-implicit-flow-aka-as-the-client-side-flow
sumber
Dari spec OAuth :
Jadi apa yang bisa kita pertimbangkan:
Ini untuk OAuth publik yaitu ketika klien tidak perlu terdaftar dan tidak memiliki rahasia klien sendiri. Tapi apa server auth memeriksa url redirect dan ini sebenarnya cukup untuk keamanan.
Token Access muncul di bilah alamat peramban sehingga pengguna dapat menyalin url dan mengirim ke orang lain dan itu juga akan dicatat sebagai pengguna, yaitu sesuatu seperti perbaikan Sesi. Tetapi browser membuat pengalihan tambahan dengan mengganti histori untuk menghapus fragmen hash dari url. Peretas juga dapat mencuri token akses dengan mengendus trafik HTTP tetapi ini dapat dengan mudah dilindungi oleh HTTPS. Beberapa ekstensi peramban jahat dapat memiliki akses ke url dari bilah alamat tetapi ini pada akhirnya merupakan situasi yang buruk seperti HTTPS cert yang rusak. Dan bahkan aliran kode Auth tidak dapat membantu di sini eter. Jadi yang bisa saya lihat adalah bahwa lewat token akses melalui potongan hash dari url benar-benar aman.
Pemisahan token akses singkat dan token refresh tidak berguna ketika menggunakan HTTPS dan jujur tidak begitu berguna bahkan pada HTTP mentah. Tetapi fakta bahwa klien melalui aliran implisit tidak dapat menerima token penyegaran juga tidak masuk akal.
Jadi saya pikir kita harus memperkenalkan aliran hibah baru "aman tersirat" yang bekerja secara ketat di https, memungkinkan token penyegaran (atau kita harus menyingkirkannya sama sekali), dan lebih disukai daripada aliran hibah Auth Cose
sumber
Bagi kami, klien kami ingin dapat mengotentikasi dengan aplikasi kami di ponsel mereka satu kali, dan tidak perlu masuk lagi selama berminggu-minggu pada suatu waktu. Dengan aliran kode, Anda mendapatkan token penyegaran bersama dengan token akses Anda. Aliran tersirat tidak memberikan Anda tanda penyegaran. Token akses memiliki kedaluwarsa yang relatif singkat, tetapi token penyegaran dapat memiliki hingga 90 hari. Setiap kali token akses kedaluwarsa, kode klien dan server dapat menggunakan token penyegaran untuk mendapatkan token akses baru plus token penyegaran, semuanya ada di belakang layar, tanpa campur tangan pengguna apa pun. Token penyegaran hanya dapat digunakan satu kali. Anda tidak dapat melakukan ini dengan Alur Tersirat. Jika Anda menggunakan Alur Tersirat, dan pengguna Anda tidak berinteraksi dengan aplikasi Anda selama lebih dari satu jam, mereka harus masuk lagi ketika mereka kembali. Itu tidak dapat diterima dalam kasus penggunaan kami,
Ini berfungsi dan aman karena token penyegaran dapat dicabut. Jika seorang pelanggan mengatakan bahwa mereka kehilangan ponsel atau laptop mereka atau seorang hacker masuk ke desktop mereka, kami dapat dengan mudah mencabut semua token penyegaran untuk pengguna tersebut. Selama seluruh proses, tidak ada Informasi Identifikasi Pribadi (PII) yang pernah menyentuh kode kami - yaitu kata sandi pengguna.
Aliran kode memang luar biasa, tetapi butuh lebih banyak pekerjaan. MS tidak memiliki perpustakaan Angular untuk menanganinya saat ini, jadi saya harus menulis satu. Jika Anda tertarik, saya dapat membantu Anda.
sumber
Jawaban saya adalah: Anda tidak dapat menerapkan aliran implisit dengan cara yang aman dan sederhana dengan server aplikasi web.
Proses otorisasi aplikasi web melibatkan interaksi pengguna sehingga Server Otentikasi harus mengarahkan kembali browser pengguna ke halaman target aplikasi web setelah otentikasi dan persetujuan pengguna (saya tidak melihat cara lain untuk mengirim pengguna kembali ke aplikasi web setelah beberapa interaksi dengan Server Otentikasi).
Jadi token harus diteruskan ke aplikasi web menggunakan URL pengalihan, kan?
Sebagaimana @NicolasGarnier menjelaskan dalam jawaban dan komentarnya, tidak ada cara untuk menyampaikan token sebagai fragmen URL - itu tidak akan mencapai server aplikasi web.
Dan memberikan token sebagai parameter URL dari redirect URL akan menjadi tidak aman bahkan di bawah HTTPS: jika halaman target (biarlah "halaman ucapan") berisi sumber daya (gambar, skrip, dll.) Sumber daya ini akan diperoleh oleh browser melalui seri permintaan HTTP (S) (masing-masing memiliki
Referer
header HTTP yang berisi URL persis "halaman salam" termasuk parameter URL). Ini adalah cara token bisa bocor.Jadi sepertinya tidak ada cara untuk meneruskan token di URL pengalihan. Itu sebabnya Anda memerlukan panggilan kedua (baik dari Server Otentikasi ke Klien (tetapi ke URL mana?) Atau dari Klien ke Server Otentikasi (panggilan kedua dalam aliran Kode Otorisasi))
sumber