HTTP 401 - uygun bir WWW-Authenticate başlık değeri nedir?


109

Şu anda üzerinde çalıştığım uygulamanın bir oturum zaman aşımı değeri var. Kullanıcı bu değerden daha uzun süre etkileşimde bulunmadıysa, yüklemeye çalıştıkları sonraki sayfada oturum açmaları istenecektir.

Yapılan tüm istekler, AJAX çağrılarını içeren bu mekanizma aracılığıyla yönlendirilir. Başlangıçta, 200 yanıtı gönderilirse kod çalıştırıldığından ve bu RPC çağrılarından geri gönderilen çoğu veri JSON veya değerlendirilen ham JavaScript olduğundan AJAX ile ilgili bazı sorunları ortaya çıkaran giriş sayfasıyla birlikte 200 başlık gönderiyorduk ( sormak: |).

JSON ayrıştırıcımız bir HTML giriş sayfasını kullanmaya çalışmayacağı için 401'in daha iyi olduğunu önerdim .. :)

Ne zaman spec okuma , ancak, farkWWW-Authenticate saha da gönderilmelidir.

Bu alan için iyi bir değer nedir? Will Application Loginyeterli?

Yanıtlar:


67

HTTP Temel Kimlik Doğrulamasını belirtirken aşağıdaki gibi bir şey döndürürüz:

WWW-Authenticate: Basic realm="myRealm"

Buna karşılık Basic şema ve geri kalanı büyük ölçüde bu plana bağlıdır. Bu durumda bölge, tarayıcıya, kullanıcı kimliği ve parolası sorulduğunda kullanıcıya gösterilebilecek bir literal sağlar.

Açıkçası Temel'i kullanmıyorsunuz, ancak Temel Kimlik Doğrulama kullanıldığında oturumun sona ermesinin bir anlamı olmadığı için. Form tabanlı bir kimlik doğrulaması kullandığınızı varsayıyorum.

Anımsamadan, Windows Challenge Response farklı bir şema ve farklı argümanlar kullanır.

İşin püf noktası, hangi şemaları desteklediğini ve bunlara nasıl yanıt vereceğini belirlemek tarayıcıya bağlı olmasıdır.

Form tabanlı kimlik doğrulama kullanıyorsanız içimden gelen his, 200+ relogin sayfasında kalmak, ancak tarayıcının yok sayacağı ancak AJAX'ınızın tanımlayabileceği özel bir başlık eklemektir.

Gerçekten iyi bir Kullanıcı + AJAX deneyimi için, komut dosyasının oturumun süresinin dolduğunu tespit eden AJAX isteğine bağlı kalmasını sağlayın, bir açılır pencere aracılığıyla yeniden oturum açma isteğini başlatın ve başarılı olduğunda orijinal AJAX isteğini yeniden gönderin ve normal şekilde devam edin.

Oturumu canlı tutmak için her 5 dakikada bir betiğin siteye girmesini sağlayan hileden kaçının çünkü bu sadece oturumun sona erme noktasını yener.

Diğer alternatif AJAX isteğini yazmaktır, ancak bu kötü bir kullanıcı deneyimidir.


2
Teşekkürler dostum, artık bir 403 kullanıyorum çünkü bu bir yönlendirme değil ve kelimenin tam anlamıyla orijinal sayfanın yerine giriş formunu içeriyor. Ayrıca W3 spesifikasyonuyla daha iyi eşleşir. Ancak bilgi için teşekkürler.
Will Morgan

2
Hala HTTP 401'i nasıl kullanabileceğinizle ilgili bu yanıta bakın: stackoverflow.com/questions/928874/…
lanoxx

Evet, sanırım WWW-Authenticate başlığına herhangi bir şey koyun. Benzer bir şekilde başka bir cevap da stackoverflow.com/a/1088127/689161'dir veya sadece spesifikasyonu ihlal edin ve başlığı göndermeye zahmet etmeyin (en azından birkaç site bunu yapar); 401 hala
403'ten

WWW-Authenticate başlığına "herhangi bir şey koyacağımdan" emin değilim çünkü isteğin ajax'ım veya tarayıcı tarafından işlendiğinden emin olamıyorum. Form tabanlı kimlik doğrulamasını öneren ayrıntı göz önüne alındığında, bu sorunun başlığının ötesinde, hiçbir WWW-Authenticate başlığı göndermem. Bunun nedeni, tarayıcıdan kimlik doğrulama / kimlik bilgisi sınamasına katılmasını istemiyorum. Sadece bir oturum açma formu olan bir form göstermesini istiyorum, ancak ajax'ın bunu tanımlamak için kullanabileceği bir şey bir oturum açma formu, böylece yukarıdaki gibi farklı şekilde işleyebilir.
Swanny

Başlık ile kullanmak için bir kimlik doğrulama şeması oluşturmalısınız. O zaman tarayıcı, düzeni anlamayacağı için dahil olmayacaktır. Başlığı dahil etmezseniz bazı müşteriler üzülür veya kafaları karışır.
KayEss


-7

Kullanıcı oturumu zaman aşımına uğradığında, bir HTTP 204 durum kodunu geri gönderiyorum. HTTP 204 durumunun içerik içermediğini unutmayın. İstemci tarafında şunu yapıyorum:

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

Reload () işlevi şöyledir:

function Reload() {
    var oForm = document.createElement("form");
    document.body.appendChild(oForm);
    oForm.submit();
    }

6
Nasıl oluyor da HTTP 204 kullanıyorsunuz? developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
Will Morgan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.