Kunci API vs Autentikasi HTTP vs OAuth di RESTful API

101

Saya sedang membangun RESTful API untuk salah satu aplikasi yang saya kelola. Kami sedang mencari untuk membangun berbagai hal ke dalamnya yang membutuhkan akses dan keamanan yang lebih terkontrol. Saat meneliti bagaimana cara mengamankan API, saya menemukan beberapa pendapat berbeda tentang formulir apa yang harus digunakan. Saya telah melihat beberapa sumber daya mengatakan HTTP-Auth adalah cara yang harus dilakukan, sementara yang lain lebih suka kunci API, dan bahkan yang lain (termasuk pertanyaan yang saya temukan di sini di SO) bersumpah demi OAuth.

Kemudian, tentu saja, yang lebih suka, katakanlah, kunci API, katakanlah bahwa OAuth dirancang untuk aplikasi yang mendapatkan akses atas nama pengguna (seperti yang saya pahami, seperti masuk ke situs non-Facebook menggunakan akun Facebook Anda), dan bukan untuk pengguna yang secara langsung mengakses sumber daya di situs yang secara khusus mereka daftarkan (seperti klien Twitter resmi yang mengakses server Twitter). Namun, rekomendasi untuk OAuth tampaknya bahkan untuk kebutuhan autentikasi paling dasar.

Pertanyaan saya, kemudian, adalah - dengan asumsi semuanya dilakukan melalui HTTPS, apa sajakah perbedaan praktis antara ketiganya? Kapan seseorang harus dipertimbangkan di atas yang lain?

Shauna
sumber
apa yang akhirnya kamu lakukan?
Irwin
@Irwin - Saya menanyakan pertanyaan ini beberapa waktu yang lalu dan sejak itu pindah dari proyek yang membutuhkannya, tetapi saya akhirnya menggunakan kombinasi kunci API dan kata sandi yang dihasilkan (yang tidak pernah dilihat pengguna), yang dikirim menggunakan otentikasi HTTP.
Shauna

Jawaban:

67

Semua tergantung dari kebutuhan Anda. Apakah anda membutuhkan:

  • Identitas - siapa yang mengklaim membuat permintaan API?
  • Otentikasi - apakah mereka benar-benar seperti yang mereka katakan?
  • Otorisasi - apakah mereka diizinkan untuk melakukan apa yang coba mereka lakukan?

atau ketiganya?

Jika Anda hanya perlu mengidentifikasi penelepon untuk melacak volume atau jumlah Panggilan API, gunakan Kunci API sederhana. Ingatlah bahwa jika pengguna yang Anda telah menerbitkan kunci API membagikannya dengan orang lain, mereka juga dapat memanggil API Anda.

Namun, jika Anda juga membutuhkan Otorisasi, yaitu Anda hanya perlu memberikan akses ke sumber daya tertentu berdasarkan pemanggil API, lalu gunakan oAuth.

Berikut deskripsi yang bagus: http://www.srimax.com/index.php/do-you-need-api-keys-api-identity-vs-authorization/

Sid
sumber
dengan "resource tertentu" yang Anda maksud dengan "panggilan api tertentu" atau "record database tertentu", atau keduanya?
Magne
Sebagian besar catatan DB (atau apa pun yang mengungkapkan status terlindungi atau status modifikasi). Tetapi itu juga bisa menjadi sesuatu seperti fitur premium (seperti menjalankan algoritma di cloud) yang tidak benar-benar mengubah apa pun di db tetapi menggunakan sumber daya sistem dan seharusnya hanya tersedia untuk individu yang berwenang.
Sid
@Sid Saya sedang mengerjakan aplikasi yang menggunakan OAuth untuk mendaftarkan pengguna yang mendaftar dengan Facebook atau LinkedIn. Selain itu kami membuka API kami untuk layanan lain untuk mengelola data. Jika demikian, apakah Anda akan merekomendasikan OAuth untuk autentikasi pengguna, dan kunci api atau kombinasi nama pengguna & sandi (seperti di artikel yang Anda tautkan) untuk layanan yang mengakses API? Kunci OAuth dan api keduanya digunakan untuk tujuan yang berbeda, bukan?
Tom Doe
@ TomDoe Hai Tom - Ya, itu masuk akal. Anda mungkin ingin menggunakan OAuth2 sekarang. Jika server Anda menggunakan Python (Django atau Flask) lihat di github.com/omab/python-social-auth
Sid
Saya tidak mengerti bagaimana kunci API tidak dapat menyediakan tiga hal ini. Identitas dan Otentikasi keduanya didasarkan pada "apakah Anda tahu rahasia tertentu?" (kecuali Anda memperkenalkan 2FA, yang merupakan topik terpisah). Jika saya memberikan kunci API Pengguna 5 yang sangat panjang, yang mengklaim dan membuktikan bahwa saya adalah Pengguna 5, setidaknya seperti nama pengguna / kata sandi. Dan tidak ada alasan mengapa seseorang tidak dapat menetapkan izin yang berbeda ke kunci API yang berbeda. Baik? Apa yang kulewatkan di sini?
Nathan Long
3

Kunci API atau bahkan Token termasuk dalam kategori mekanisme Autentikasi dan Otorisasi langsung, karena mereka memberikan akses ke sumber daya REST API yang terbuka. Mekanisme langsung seperti itu dapat digunakan dalam kasus penggunaan delegasi.

Untuk mendapatkan akses ke sumber daya atau sekumpulan sumber daya yang diekspos oleh titik akhir REST, diperlukan untuk memeriksa hak istimewa pemohon sesuai dengan identitasnya. Langkah pertama dari alur kerja adalah memverifikasi identitas dengan mengautentikasi permintaan; langkah berturut-turut adalah memeriksa identitas terhadap seperangkat aturan yang ditetapkan untuk mengotorisasi tingkat akses (yaitu membaca, menulis atau membaca / menulis). Setelah langkah-langkah tersebut diselesaikan, perhatian khusus selanjutnya adalah tingkat permintaan yang diizinkan , yang berarti berapa banyak permintaan per detik yang diizinkan untuk dilakukan oleh pemohon terhadap sumber daya yang diberikan.

OAuth (Open Authorization) adalah protokol standar untuk akses yang didelegasikan , sering digunakan oleh Perusahaan Internet besar untuk memberikan akses tanpa memberikan sandi. Jelasnya, OAuth adalah protokol yang memenuhi masalah yang disebutkan di atas: Autentikasi dan Otorisasi dengan memberikan akses yang didelegasikan secara aman ke sumber daya server atas nama pemilik sumber daya. Ini didasarkan pada mekanisme Token akses yang memungkinkan pihak ketiga untuk mendapatkan akses ke sumber daya yang dikelola oleh server atas nama pemilik sumber daya. Misalnya, ServiceX ingin mengakses Akun Google John Smith atas nama John, setelah John memberi otorisasi kepada delegasi; ServiceX kemudian akan mengeluarkan Token berbasis waktu untuk mengakses detail Akun Google, kemungkinan besar hanya dalam akses baca.

Konsep Kunci API sangat mirip dengan Token OAuth yang dijelaskan di atas. Perbedaan utama terletak pada tidak adanya delegasi: Pengguna secara langsung meminta Kunci tersebut ke penyedia layanan untuk interaksi terprogram yang berurutan. Kasus Kunci API juga berdasarkan waktu: Kunci sebagai Token OAuth tunduk pada sewa waktu, atau periode kedaluwarsa. Sebagai aspek tambahan, Kunci dan Token dapat dikenakan pembatasan tarif berdasarkan kontrak layanan, yaitu hanya sejumlah permintaan tertentu per detik yang dapat dilayani.

Singkatnya, pada kenyataannya tidak ada perbedaan nyata antara mekanisme Otentikasi dan Otorisasi tradisional dan versi berbasis Kunci / Token. Paradigmanya sedikit berbeda: alih-alih tetap menggunakan kembali kredensial di setiap dan setiap interaksi antara klien dan server, Key / Token dukungan digunakan yang membuat keseluruhan pengalaman interaksi lebih lancar dan kemungkinan lebih aman (sering kali, mengikuti standar JWT , Kunci dan Token ditandatangani secara digital oleh server untuk menghindari kerajinan).

  • Autentikasi dan Otorisasi Langsung : Protokol berbasis kunci sebagai varian dari versi berbasis kredensial tradisional.
  • Autentikasi dan Otorisasi yang Didelegasikan : seperti protokol berbasis OAuth, yang pada gilirannya menggunakan Token, sekali lagi sebagai varian dari versi berbasis kredensial (sasaran keseluruhan tidak mengungkapkan kata sandi kepada pihak ketiga mana pun).

Kedua kategori menggunakan alur kerja verifikasi identitas tradisional untuk interaksi pertama dengan server yang memiliki sumber daya yang diminati.

Paolo Maresca
sumber