HTTP 401 - apa nilai header WWW-Authenticate yang sesuai?

109

Aplikasi yang saya kerjakan saat ini memiliki nilai batas waktu sesi. Jika pengguna tidak berinteraksi lebih lama dari nilai ini, halaman berikutnya yang mereka coba muat, mereka akan diminta untuk masuk.

Semua permintaan yang dibuat dirutekan melalui mekanisme ini, yang mencakup panggilan AJAX. Awalnya kami mengirimkan 200 header dengan halaman login, yang menimbulkan beberapa masalah dengan AJAX karena kode dijalankan jika 200 respons dikirim, dan sebagian besar data yang dikirim kembali dari panggilan RPC ini adalah JSON atau JavaScript mentah yang dievaluasi (jangan bertanya: |).

Saya menyarankan bahwa 401 lebih baik, karena pengurai JSON kita tidak akan mencoba menggunakan halaman login HTML .. :)

Namun, saat membaca spesifikasi , saya perhatikan bahwa WWW-Authenticatebidang tersebut juga harus dikirim.

Berapa nilai yang bagus untuk bidang ini? Apakah Application Logincukup?

Will Morgan
sumber

Jawaban:

67

Saat menunjukkan Otentikasi Dasar HTTP, kami mengembalikan sesuatu seperti:

WWW-Authenticate: Basic realm="myRealm"

Sedangkan Basicskema dan sisanya sangat bergantung pada skema itu. Dalam hal ini realm hanya menyediakan browser literal yang dapat ditampilkan kepada pengguna saat meminta ID pengguna dan kata sandi.

Anda jelas tidak menggunakan Basic namun karena tidak ada gunanya sesi berakhir saat Basic Auth digunakan. Saya berasumsi Anda menggunakan beberapa bentuk otentikasi berbasis Formulir.

Dari ingatan, Windows Challenge Response menggunakan skema yang berbeda dan argumen yang berbeda.

Triknya adalah tergantung pada browser untuk menentukan skema apa yang didukungnya dan bagaimana ia menanggapinya.

Perasaan saya jika Anda menggunakan otentikasi berbasis formulir adalah tetap dengan halaman relogin 200 + tetapi menambahkan tajuk khusus yang akan diabaikan browser tetapi AJAX Anda dapat mengidentifikasi.

Untuk pengalaman Pengguna + AJAX yang benar-benar bagus, dapatkan skrip untuk bertahan pada permintaan AJAX yang mendapati sesi telah kedaluwarsa, jalankan permintaan masuk kembali melalui munculan, dan jika berhasil, kirim ulang permintaan AJAX asli dan lanjutkan seperti biasa.

Hindari cheat yang hanya membuat skrip masuk ke situs setiap 5 menit untuk menjaga sesi tetap hidup karena hanya mengalahkan titik kadaluwarsa sesi.

Alternatif lainnya adalah membakar permintaan AJAX tetapi itu adalah pengalaman pengguna yang buruk.

Swanny
sumber
2
Terima kasih sobat, saya sekarang menggunakan 403 sebagai gantinya karena ini bukan pengalihan dan itu benar-benar menyertakan formulir login sebagai pengganti halaman asli. Ini juga lebih cocok dengan spesifikasi W3. Namun terima kasih atas informasinya.
Akankah Morgan
2
Lihat jawaban ini tentang bagaimana Anda masih dapat menggunakan HTTP 401: stackoverflow.com/questions/928874/…
lanoxx
Ya, taruh saja di header WWW-Authenticate, saya kira. Jawaban lain yang serupa adalah stackoverflow.com/a/1088127/689161 Atau cukup langgar spesifikasi dan jangan repot-repot mengirimkan header (setidaknya beberapa situs melakukan ini); 401 masih lebih sesuai daripada 403.
gengkev
Saya tidak yakin saya akan "meletakkan apa saja" di header WWW-Authenticate karena saya tidak yakin apakah permintaan tersebut ditangani oleh ajax saya atau browser. Di luar judul pertanyaan ini, mengingat detail yang menyarankan otentikasi berbasis formulir, saya tidak akan mengirim header WWW-Authenticate sama sekali. Ini karena saya tidak meminta browser untuk berpartisipasi dalam hal tantangan otentikasi / kredensial. Saya hanya ingin menunjukkan formulir yang kebetulan merupakan formulir logon, tetapi dengan sesuatu yang dapat digunakan ajax untuk mengidentifikasinya adalah formulir masuk sehingga dapat menanganinya secara berbeda seperti di atas.
Swanny
Anda harus membuat skema authn untuk digunakan dengan header. Kemudian browser tidak akan terlibat karena tidak memahami skema. Beberapa klien menjadi kesal atau bingung jika Anda tidak menyertakan header.
KayEss
-7

Ketika sesi pengguna habis waktu, saya mengirim kembali kode status HTTP 204. Perhatikan bahwa status HTTP 204 tidak berisi konten. Di sisi klien saya melakukan ini:

xhr.send(null);
if (xhr.status == 204) 
    Reload();
else 
    dropdown.innerHTML = xhr.responseText;

Berikut adalah fungsi Reload ():

function Reload() {
    var oForm = document.createElement("form");
    document.body.appendChild(oForm);
    oForm.submit();
    }
Smurfling
sumber
6
Kenapa Anda menggunakan HTTP 204? developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
Will Morgan