OAuth 2.0 memiliki banyak alur kerja. Saya punya beberapa pertanyaan tentang keduanya.
- Alur kode otorisasi - Pengguna masuk dari aplikasi klien, server otorisasi mengembalikan kode otorisasi ke aplikasi. Aplikasi kemudian menukar kode otorisasi dengan token akses.
- Aliran hibah implisit - Pengguna masuk dari aplikasi klien, server otorisasi mengeluarkan token akses ke aplikasi klien secara langsung.
Apa perbedaan antara kedua pendekatan dalam hal keamanan? Mana yang lebih aman dan mengapa?
Saya tidak melihat alasan mengapa langkah tambahan (pertukaran kode otorisasi untuk token) ditambahkan dalam satu alur kerja ketika server dapat langsung mengeluarkan token Access.
Situs web yang berbeda mengatakan bahwa aliran kode Otorisasi digunakan ketika aplikasi klien dapat menjaga keamanan kredensial. Mengapa?
Jawaban:
Ini
access_token
adalah apa yang Anda butuhkan untuk memanggil sumber daya yang dilindungi (API). Dalam aliran Kode Otorisasi ada 2 langkah untuk mendapatkannya:code
ke konsumen API (disebut "Klien").code
diperoleh di # 1 denganaccess_token
, mengautentikasi sendiri denganclient_id
danclient_secret
access_token
.Jadi, ada pemeriksaan ganda: pengguna yang memiliki sumber daya muncul melalui API dan klien menggunakan API (misalnya aplikasi web). Keduanya divalidasi agar akses diberikan. Perhatikan sifat "otorisasi" OAuth di sini: pengguna memberikan akses ke sumber dayanya (melalui pengembalian
code
setelah otentikasi) ke suatu aplikasi, aplikasi mendapatkanaccess_token
, dan memanggil atas nama pengguna.Dalam aliran implisit, langkah 2 dihilangkan. Jadi setelah otentikasi pengguna, sebuah
access_token
dikembalikan secara langsung, yang dapat Anda gunakan untuk mengakses sumber daya. API tidak tahu siapa yang memanggil API itu. Siapa pun denganaccess_token
kaleng, sedangkan dalam contoh sebelumnya hanya aplikasi web akan (internal itu biasanya tidak dapat diakses oleh siapa pun).Aliran implisit biasanya digunakan dalam skenario di mana penyimpanan
client id
danclient secret
tidak dianjurkan (misalnya perangkat, meskipun banyak yang melakukannya). Itulah yang dimaksud penafian. Orang-orang memiliki akses ke kode klien dan karenanya dapat memperoleh kredensial dan berpura-pura menjadi klien sumber daya. Dalam aliran implisit semua data volatile dan tidak ada yang disimpan di aplikasi.sumber
/authorize
permintaannya. Browser dan situs web mencoba memanggil API (alias klien). Itu adalahredirect_uri
+ yangcode
dikembalikan oleh AS setelah otentikasi berhasil. Akhirnya, klien memanggil AS di belakang layar, bertukarcode
untukaccess_token
. Ini adalahtoken endpoint
dalam literatur. Secara umum SA tidak pernah memanggil siapa pun. Itu selalu balasan.Saya akan menambahkan sesuatu di sini yang saya pikir tidak dijelaskan dalam jawaban di atas:
tl; dr tidak menggunakan aliran implisit jika Anda tidak percaya mesin pengguna untuk token terus tetapi Anda lakukan percaya server Anda sendiri.
sumber
access_token
dengan bantuanauthorization code
.Perbedaan antara keduanya adalah:
Dalam aliran tersirat, token dikembalikan langsung melalui URL pengalihan dengan tanda "#" dan ini digunakan terutama pada klien javascript atau aplikasi seluler yang tidak memiliki sisi server sendiri, dan klien tidak perlu memberikan rahasianya dalam beberapa implementasi .
Dalam aliran kode Otorisasi, kode dikembalikan dengan "?" agar dapat dibaca oleh sisi server maka sisi server harus memberikan rahasia klien kali ini ke token url untuk mendapatkan token sebagai objek json dari server otorisasi. Ini digunakan jika Anda memiliki server aplikasi yang dapat menangani hal ini dan menyimpan token pengguna dengan profilnya di sistemnya sendiri, dan sebagian besar digunakan untuk aplikasi seluler umum.
jadi itu tergantung pada sifat aplikasi klien Anda, mana yang lebih aman "kode otorisasi" karena meminta rahasia pada klien dan token dapat dikirim antara server otorisasi dan aplikasi klien pada koneksi yang sangat aman, dan penyedia otorisasi dapat batasi beberapa klien untuk hanya menggunakan "Kode Otorisasi" dan melarang Implisit
sumber
Hibah implisit mirip dengan hibah kode otorisasi dengan dua perbedaan yang berbeda.
Ini dimaksudkan untuk digunakan untuk klien berbasis agen pengguna (misalnya aplikasi web satu halaman) yang tidak dapat menjaga rahasia klien karena semua kode aplikasi dan penyimpanan mudah diakses.
Kedua alih-alih server otorisasi mengembalikan kode otorisasi yang ditukar dengan token akses, server otorisasi mengembalikan token akses.
Silakan temukan detailnya di sini http://oauth2.thephpleague.com/authorization-server/which-grant/
sumber
Aliran tersirat
Keuntungan
Kekurangan
Alur kode otorisasi
Keuntungan
Kekurangan
Kutipan: https://developers.google.com/actions/develop/identity/oauth2-overview#supported_oauth_20_flows
sumber
Biarkan saya merangkum poin-poin yang saya pelajari dari jawaban di atas dan tambahkan beberapa pemahaman saya sendiri.
Alur Kode Otorisasi !!!
Aliran Hibah Tersirat !!!
sumber
Keduanya aman, tergantung pada lingkungan yang Anda gunakan.
Sederhana saja. Klien Anda tidak aman. Mari kita lihat secara detail.
Pertimbangkan Anda membuat aplikasi yang menentang
Instagram API
, sehingga Anda mendaftarkan aplikasi Anda denganInstagram
dan menentukan yangAPI's
Anda butuhkan.Instagram
akan memberi Andaclient_id
danclient_secrect
Di situs web Anda, Anda membuat tautan yang mengatakan. "Datang dan Gunakan Aplikasi Saya". Mengklik ini aplikasi web Anda harus membuat dua panggilan
Instagram API
.First
kirim permintaan keInstagram Authentication Server
dengan parameter di bawah ini.Anda tidak mengirim
client_secret
, Anda tidak bisa mempercayai klien (Pengguna dan peramban yang mencoba menggunakan aplikasi Anda). Klien dapat melihat url atau skrip java dan menemukan Andaclient_secrect
dengan mudah. Inilah sebabnya mengapa Anda perlu langkah lain.Anda menerima
code
danstate
. Dicode
sinitemporary
dan tidak disimpan di mana pun.Kemudian Anda melakukan
second
panggilan keInstagram API
(dari server Anda)Karena panggilan dilakukan dari server kami, kami dapat menggunakan dengan aman
client_secret
(yang menunjukkan bagaimana kami) dengancode
yang menunjukkan pengguna telah memberikanclient_id
untuk menggunakan sumber daya.Sebagai tanggapan kita akan memiliki
access_token
sumber
Dari perspektif praktis (Apa yang saya mengerti), Alasan utama untuk memiliki aliran kode Authz adalah:
"Server otorisasi mengotentikasi pemilik sumber daya (melalui agen-pengguna) dan menetapkan apakah pemilik sumber daya mengabulkan atau menolak permintaan akses klien"
Selain itu, Menggunakan token penyegaran, Aplikasi bisa mendapatkan akses jangka panjang ke data pengguna.
sumber
Tampaknya ada dua poin kunci, tidak dibahas sejauh ini, yang menjelaskan mengapa jalan memutar dalam Jenis Hibah Kode Otorisasi menambah keamanan.
Cerita pendek : Jenis Hibah Kode Otorisasi menyimpan informasi sensitif dari riwayat peramban, dan transmisi token hanya bergantung pada perlindungan HTTPS dari server otorisasi.
Versi yang lebih panjang:
Berikut ini, saya akan tetap menggunakan terminologi OAuth 2 yang didefinisikan dalam RFC (ini adalah bacaan cepat): server sumber daya , klien , server otorisasi , pemilik sumber daya .
Bayangkan Anda ingin beberapa aplikasi pihak ketiga (= klien) mengakses data tertentu dari akun Google Anda (= server sumber daya). Anggap saja Google menggunakan OAuth 2. Anda adalah pemilik sumber daya untuk akun Google, tetapi saat ini Anda mengoperasikan aplikasi pihak ketiga.
Pertama, klien membuka browser untuk mengirim Anda ke URL aman server otorisasi Google. Kemudian Anda menyetujui permintaan untuk akses, dan server otorisasi mengirim Anda kembali ke URL pengalihan yang sebelumnya diberikan klien, dengan kode otorisasi dalam string kueri. Sekarang untuk dua poin utama:
Dengan Jenis Hibah Kode Otorisasi, token akhirnya diperoleh dengan panggilan dari klien ke server otorisasi, di mana keamanan transmisi hanya tergantung pada server otorisasi , bukan pada klien.
sumber