Header Otorisasi HTTP Kustom

124

Saya ingin tahu apakah dapat diterima untuk meletakkan data khusus di header otorisasi HTTP. Kami sedang merancang RESTful API dan kami mungkin memerlukan cara untuk menentukan metode otorisasi khusus. Sebagai contoh, sebut saja FIRE-TOKENotentikasi.

Apakah hal seperti ini valid dan diizinkan sesuai dengan spesifikasi: Authorization: FIRE-TOKEN 0PN5J17HBGZHT7JJ3X82:frJIUN8DYpKDtOLCwo//yllqDzg=

Bagian pertama dari string kedua (sebelum ':') adalah kunci API, bagian kedua adalah hash string kueri.

NRaf
sumber

Jawaban:

133

Format yang ditentukan dalam RFC2617 adalah credentials = auth-scheme #auth-param. Jadi, dalam menyetujui fumanchu, saya pikir skema otorisasi yang diperbaiki akan terlihat seperti itu

Authorization: FIRE-TOKEN apikey="0PN5J17HBGZHT7JJ3X82", hash="frJIUN8DYpKDtOLCwo//yllqDzg="

Di mana FIRE-TOKENskema dan dua pasangan kunci-nilai adalah parameter autentikasi. Meskipun saya yakin kutipannya opsional (dari Apendix B p7-auth-19) ...

auth-param = token BWS "=" BWS ( token / quoted-string )

Saya yakin ini sesuai dengan standar terbaru, sudah digunakan (lihat di bawah), dan menyediakan format nilai kunci untuk ekstensi sederhana (jika Anda memerlukan parameter tambahan).

Beberapa contoh sintaks auth-param ini dapat dilihat di sini ...

http://tools.ietf.org/html/draft-ietf-httpbis-p7-auth-19#section-4.4

https://developers.google.com/youtube/2.0/developers_guide_protocol_clientlogin

https://developers.google.com/accounts/docs/AuthSub#WorkingAuthSub

StarTrekRedneck
sumber
4
API penyimpanan sederhana Amazon menawarkan contoh lain.
uskup
18

Taruh di header khusus yang terpisah.

Membebani header HTTP standar mungkin akan menyebabkan lebih banyak kebingungan daripada nilainya, dan akan melanggar prinsip yang paling tidak mengejutkan . Ini juga dapat menyebabkan masalah interoperabilitas untuk pemrogram klien API Anda yang ingin menggunakan tool kit off-the-shelf yang hanya dapat menangani bentuk standar dari header HTTP biasa (seperti Authorization).

Brian Kelly
sumber
3
Ini mungkin lebih sulit untuk dilakukan dengan benar daripada yang terlihat. Tautan yang disediakan fumanchu (dalam komentar pada jawabannya) menjelaskan mengapa memperkenalkan tajuk khusus menambah beban tambahan karena sekarang harus mengatur Kontrol-Cache dengan benar.
Jon-Eric
4
Selain itu, jika Anda membuat permintaan lintas asal melalui browser, Anda sekarang berada di wilayah pra-penerbangan hanya karena tajuk khusus di mana Anda bisa menghindarinya. Untuk aplikasi tertentu, permintaan ini bertambah.
Wil Moore III
31
Sangat tidak untuk header otentikasi khusus. AuthorizationHeader standar spesifikasi dengan skema kustom Anda sendiri sudah lebih dari cukup. Selain itu, Anda menghindari permintaan Origin sebelum penerbangan seperti yang diindikasikan oleh @wilmoore. Skema khusus tidak mengganggu server HTTP yang cukup modern yang saya ketahui, ditambah lagi jika Anda menggunakan skema Anda sendiri, Anda harus menguraikannya sendiri - tidak ada pustaka yang konflik (jika tidak pustaka ditulis dengan buruk).
Les Hazlewood
7
Alasan yang baik untuk mengirimkan kredensial di Authorizationtajuk, bukan di tajuk khusus, adalah karena proksi dan pencatat tahu memperlakukan informasi sebagai informasi yang sensitif.
Eron Wright
15

Tidak, itu bukan produksi yang valid menurut definisi "kredensial" di RFC 2617 . Anda memberikan skema autentikasi yang valid, tetapi nilai parameter-auth harus dalam format token "=" ( token | quoted-string )(lihat bagian 1.2), dan contoh Anda tidak menggunakan "=" seperti itu.

fumanchu
sumber
1
Itu tidak benar. Lihat halaman 5 dokumen untuk contoh format: Otorisasi: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ ==
NRaf
11
Itu benar. Tapi seperti yang dikatakan tools.ietf.org/html/draft-ietf-httpbis-p7-auth-16#section-2.3.1 , "Notasi" b64token "diperkenalkan untuk kompatibilitas dengan skema otentikasi yang ada dan hanya dapat digunakan sekali per challenge / credentials. Dengan demikian, skema baru harus menggunakan sintaks "auth-param", karena jika tidak, ekstensi di masa mendatang tidak mungkin dilakukan. " Lihat juga diskusi cache di sana terkait melakukan auth di header kustom.
fumanchu
9

Pertanyaan lama yang saya tahu, tetapi bagi yang penasaran:

Percaya atau tidak, masalah ini telah diselesaikan ~ 2 dekade yang lalu dengan HTTP BASIC, yang meneruskan nilai sebagai nama pengguna yang dikodekan base64: sandi. (Lihat http://en.wikipedia.org/wiki/Basic_access_authentication#Client_side )

Anda bisa melakukan hal yang sama, sehingga contoh di atas menjadi:

Authorization: FIRE-TOKEN MFBONUoxN0hCR1pIVDdKSjNYODI6ZnJKSVVOOERZcEtEdE9MQ3dvLy95bGxxRHpnPQ==
Mike Marcacci
sumber
4
Saya tidak menyarankan jawaban ini, karena, berdasarkan komentar pada jawaban lain di sini , notasi yang digunakan di sini adalah untuk kompatibilitas dengan skema yang ada dan tidak disarankan untuk ekstensi baru.
Whymarrh