HTTP 401 - giá trị tiêu đề WWW-Authenticate thích hợp là gì?


109

Ứng dụng tôi đang làm việc hiện tại có giá trị thời gian chờ của phiên. Nếu người dùng không tương tác lâu hơn giá trị này, trang tiếp theo mà họ cố gắng tải, họ sẽ được nhắc đăng nhập.

Tất cả các yêu cầu được thực hiện đều được định tuyến thông qua cơ chế này, bao gồm các cuộc gọi AJAX. Ban đầu, chúng tôi đang gửi một tiêu đề 200 với trang đăng nhập, trang này giới thiệu một số vấn đề với AJAX vì mã được chạy nếu phản hồi 200 được gửi và hầu hết dữ liệu được gửi lại từ các lệnh gọi RPC này là JSON hoặc JavaScript thô được đánh giá (không hỏi: |).

Tôi đã gợi ý rằng 401 tốt hơn, vì trình phân tích cú pháp JSON của chúng tôi sẽ không cố sử dụng trang đăng nhập HTML .. :)

Tuy nhiên, khi đọc thông số kỹ thuật , tôi nhận thấy rằng WWW-Authenticatetrường cũng phải được gửi.

Giá trị tốt cho lĩnh vực này là gì? Sẽ Application Loginđủ?

Câu trả lời:


67

Khi chỉ ra Xác thực cơ bản HTTP, chúng tôi trả về một cái gì đó như:

WWW-Authenticate: Basic realm="myRealm"

Trong khi đó Basiclà sơ đồ và phần còn lại phụ thuộc rất nhiều vào sơ đồ đó. Trong trường hợp này, lĩnh vực này chỉ cung cấp cho trình duyệt một ký tự có thể được hiển thị cho người dùng khi nhắc nhập id người dùng và mật khẩu.

Tuy nhiên, rõ ràng là bạn không sử dụng Basic vì không có nghĩa là phiên hết hạn khi sử dụng Basic Auth. Tôi giả sử bạn đang sử dụng một số hình thức xác thực dựa trên Biểu mẫu.

Từ hồi ức, Windows Challenge Response sử dụng một lược đồ khác và các đối số khác nhau.

Bí quyết là tùy thuộc vào trình duyệt để xác định những chương trình mà nó hỗ trợ và cách nó phản ứng với chúng.

Cảm nhận của tôi nếu bạn đang sử dụng xác thực dựa trên biểu mẫu là ở lại với trang đăng nhập lại 200+ nhưng thêm tiêu đề tùy chỉnh mà trình duyệt sẽ bỏ qua nhưng AJAX của bạn có thể xác định.

Để có trải nghiệm Người dùng + AJAX thực sự tốt, hãy sử dụng tập lệnh để tiếp tục yêu cầu AJAX khi phiên đã hết hạn, kích hoạt yêu cầu đăng nhập lại thông qua cửa sổ bật lên và nếu thành công, hãy gửi lại yêu cầu AJAX ban đầu và tiếp tục như bình thường.

Tránh gian lận chỉ khiến tập lệnh truy cập trang web cứ sau 5 phút để giữ cho phiên hoạt động vì điều đó chỉ làm mất điểm hết hạn phiên.

Giải pháp thay thế khác là ghi yêu cầu AJAX nhưng đó là trải nghiệm người dùng kém.


2
Cảm ơn người bạn đời, tôi hiện đang sử dụng 403 thay vì nó không phải là chuyển hướng và nó thực sự bao gồm biểu mẫu đăng nhập thay cho trang gốc. Nó cũng phù hợp hơn với đặc điểm kỹ thuật W3. Cảm ơn vì thông tin tuy nhiên.
Will Morgan,

2
Xem câu trả lời này về cách bạn vẫn có thể sử dụng HTTP 401: stackoverflow.com/questions/928874/…
lanoxx 30/09/13

Có, tôi cho là chỉ cần đặt bất cứ thứ gì vào tiêu đề WWW-Authenticate. Một câu trả lời khác tương tự là stackoverflow.com/a/1088127/689161 Hoặc đơn giản là vi phạm thông số kỹ thuật và không bận tâm gửi tiêu đề (ít nhất một vài trang web làm điều này); 401 vẫn thích hợp hơn 403.
gengkev

Tôi không chắc mình sẽ "chỉ đặt bất cứ thứ gì" trong tiêu đề WWW-Authenticate vì tôi không thể chắc chắn liệu yêu cầu có được xử lý bởi ajax của tôi hay trình duyệt hay không. Ngoài tiêu đề của câu hỏi này, với chi tiết gợi ý xác thực dựa trên biểu mẫu, tôi sẽ không gửi tiêu đề WWW-Authenticate nào cả. Điều này là do tôi không yêu cầu trình duyệt tham gia thử thách xác thực / thông tin xác thực. Tôi chỉ muốn nó hiển thị một biểu mẫu chỉ xảy ra là một biểu mẫu đăng nhập, nhưng với một cái gì đó mà ajax có thể sử dụng để xác định nó là một biểu mẫu đăng nhập để nó có thể xử lý nó theo cách khác như trên.
Swanny

Bạn nên tạo một lược đồ authn để sử dụng với tiêu đề. Sau đó, trình duyệt sẽ không tham gia vì nó sẽ không hiểu sơ đồ. Một số khách hàng sẽ khó chịu hoặc bối rối nếu bạn không bao gồm tiêu đề.
KayEss


-7

Khi phiên người dùng hết thời gian chờ, tôi gửi lại mã trạng thái HTTP 204. Lưu ý rằng trạng thái HTTP 204 không chứa nội dung. Về phía khách hàng, tôi làm điều này:

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

Đây là hàm Nạp lại ():

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

6
Làm thế nào bạn đang sử dụng HTTP 204? developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
Will Morgan,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.