Tempat menempatkan kunci API: tajuk HTTP khusus VS tajuk Otorisasi dengan skema khusus

17

Saya merancang REST API menggunakan otorisasi / otentikasi melalui Kunci API.

Saya mencoba mencari tahu apa tempat terbaik untuk itu dan menemukan bahwa banyak orang menyarankan menggunakan header HTTP khusus seperti ProjectName-Api-Key, misalnya:

ProjectName-Api-Key: abcde

tetapi juga mungkin dan secara ideologis benar untuk menggunakan Authorizationheader dengan skema khusus, misalnya:

Authorization: ApiKey abcde

Di sisi lain, saya menemukan pertimbangan bahwa skema Otorisasi khusus bisa tidak terduga dan tidak didukung oleh beberapa klien dan mengarah ke kode kustom, jadi lebih baik menggunakan header khusus karena klien tidak memiliki harapan tentang hal itu.

Cara mana yang Anda inginkan untuk mengirim Kunci API?

RomanG
sumber
Proyek-proyek di bawah panduan saya menggunakan Authorization: Bearer <token>tajuk dan tidak pernah ada masalah dengan itu. Tokennya adalah JWT .
Andy
1
@ DavidPacker Seperti yang saya mengerti, Bearerskema digunakan secara eksklusif dengan oAuth2. Menerapkannya secara terpisah dari oAuth terdengar sebagai penyalahgunaan. Mengapa benar menggunakan skema ini jika tidak ada oAuth? Omong-omong, saya kesulitan memilih jenis otorisasi untuk API saya. API hanya akan tersedia untuk satu layanan tepercaya, jadi saya menyelidiki aliran kredensial klien dari oAuth2 dan belum menemukan manfaat apa pun dibandingkan dengan ApiKey dalam kasus saya.
RomanG
@DavidPacker Kemudian saya mengerti, bahwa otorisasi ApiKey dapat dianggap sebagai implementasi oAuth yang valid jika ApiKeydiganti nama dan ditafsirkan sebagai Access Tokendiberikan kepada klien tanpa waktu kedaluwarsa. Itu semacam aspek filosofis, saya memutuskan untuk tidak membawa definisi yang rumit jika kasus saya dapat dijelaskan dalam istilah sederhana dan memutuskan untuk menyebutnya "ApiKey". Jika protokol Anda menerapkan standar OAuth, saya bisa setuju untuk menggunakan Bearer, tetapi tidak, saya kira skema ini tidak dapat diterapkan.
RomanG
2
Anda terlalu membatasi diri. Konsumen API tidak peduli apakah Anda menerapkan OAuth atau tidak. Apa yang mereka pedulikan adalah keamanan token, bahwa pemberian token berfungsi dan bahwa mereka dapat diotentikasi dengan benar. Mereka merekomendasikan untuk menggunakan Bearer tepat di dokumentasi JWT . JWT sangat cocok dengan skema Pembawa dan saya tidak bisa merekomendasikan JWT lebih banyak. Mereka sangat cocok untuk aplikasi REST karena Anda dapat mengotentikasi pengguna bahkan tanpa memukul database - kecuali jika Anda memerlukan fitur token pencabutan.
Andy
1
(drive oleh) ... harap berhati-hati untuk mengetahui bahwa kunci api yang berbagi rahasia biasanya dibagi antara pihak mengandalkan dikonfigurasi dan authenticator, tidak untuk berkomunikasi identitas atau otorisasi. Dinyatakan dengan cara lain, mereka hanya dimaksudkan untuk memulai jabat tangan keamanan, bukan merupakan hasil otentikasi. Kunci api mengkomunikasikan wewenang Anda untuk mengidentifikasi diri sendiri terhadap autentikator tepercaya sistem. Menggunakan kunci sebagai token untuk mengontrol akses sumber daya yang aman adalah juju yang buruk
K. Alan Bates

Jawaban:

12

Jika Anda menggunakan Otorisasi, konsistenlah

Beberapa orang akan berpendapat bahwa yang berikut ini tidak perlu ( dan belum lama ini saya akan setuju dengan mereka ) tetapi, hari ini, jika kita menggunakan Authorizationheader kita harus menginformasikan jenis token, karena kunci API tidak self-deskriptif per se 1 .

Mengapa saya pikir itu perlu dan mengapa saya pikir itu penting? Karena saat ini mendukung berbagai protokol otentikasi / otorisasi telah menjadi keharusan. Jika kami berencana untuk menggunakan Authorizationtajuk untuk semua protokol ini, kami harus membuat layanan auth kami konsisten. Cara untuk mengomunikasikan jenis token apa yang kami kirim dan protokol otorisasi apa yang harus diterapkan harus dimasukkan dalam header juga.

Authorization: Basic xxxx
Authorization: Digest xxxx
Authorization: Bearer xxxx
Authorization: ApiKey-v1 xxxx
Authorization: ApiKey-v2 xxxx

Saya dulu tidak peduli dengan ini, tetapi setelah bekerja dengan aplikasi klien aplikasi yang pembaruannya tidak dijamin (kebanyakan ponsel dan sensor), saya mulai. Saya mulai lebih berhati-hati dalam cara saya menerapkan keamanan sehingga saya dapat mengembangkannya tanpa mengacaukan klien dan tanpa terlalu banyak rasa sakit di sisi server.

Kekhawatiran

Masalah yang saya hadapi dalam mengimplementasikan skema saya sendiri mirip dengan yang dikomentari.

Di sisi lain, saya menemukan pertimbangan bahwa skema Otorisasi khusus dapat tidak terduga dan tidak didukung oleh beberapa klien dan tetap mengarah ke kode kustom

Katakan klien , katakan perpustakaan, kerangka kerja, proksi terbalik .

Keuntungan

Satu keuntungan penting adalah cache. Tembolok yang dibagikan tidak akan men-cache header (dan tentu saja itu bagus) kecuali jika Anda mengatakan sebaliknya.

Jadi Otorisasi atau custom header?

Menurut pengalaman saya, mengimplementasikan Authorizationskema saya sendiri telah mengambil jumlah pekerjaan yang sama (atau lebih) daripada menerapkan header otorisasi khusus, dengan sedikit perbedaan memiliki lebih banyak kebebasan desain dan lebih banyak kontrol atas cache ketika saya menggunakan header kustom. Alasannya agak bodoh, sebagian besar waktu saya Cache-controlmengatur no-cacheatau no-store, memungkinkan saya untuk membuat panggilan ke server lebih deterministik (ini penting ketika datang untuk melacak dan menguji) terlepas dari topologi jaringan.


1: Saya menemukan jawaban ini sangat jelas tentang Kunci API

Laiv
sumber
4
Penggunaan X-sudah ditinggalkan pada 2012: stackoverflow.com/a/3561399/923720
Darkhogg
1
ops! Saya tidak tahu. Diedit dan diperbaiki.
Laiv
Sebelum pertanyaan ini, saya pikir kebanyakan orang meletakkan kunci API di URL, tetapi menggunakan HTTPS untuk menyembunyikannya. Baik untuk melihat beberapa alternatif. Misalnya, Contentful memungkinkan Otorisasi atau kueri pamameter: contentful.com/developers/docs/references/content-delivery-api/…
user949300
1
@ user949300 ... menggunakan rahasia bersama terenkripsi (mis. kunci api di uri lebih dari ssl) jelas lebih aman daripada tidak sama sekali, tetapi mudah dipalsukan jika dicegat dan tidak memberikan rincian tentang identitas. Saya tidak pernah menggunakan api_keys untuk hal lain selain komunikasi mesin ke mesin di mana saya mencocokkan rahasia bersama antara pihak-pihak yang dipercaya dan identitas mesin yang masuk daftar putih untuk bertindak dengan rahasia bersama itu. Setelah penghubung mesin ke mesin dibuat, operator manusia melakukan otentikasi menggunakan cara lain.
K. Alan Bates
@ K. Alan Bates Sebagian besar interaksi API saya adalah untuk hal-hal yang relatif "tidak penting" seperti tingkatan geocoding gratis, laporan cuaca, dan sejenisnya, di mana kunci API lebih untuk membatasi tingkat daripada rahasia pengguna yang serius. Jadi, untuk OP, tergantung pada tingkat keamanan apa yang dibutuhkan.
user949300