HTTP 401 - яке відповідне значення заголовка WWW-Authenticate?


109

Програма, над якою я працюю на даний момент, має значення тайм-ауту сеансу. Якщо користувач не взаємодіяв довше, ніж це значення, на наступній сторінці, яку він намагається завантажити, йому буде запропоновано увійти.

Усі зроблені запити спрямовуються через цей механізм, який включає дзвінки AJAX. Спочатку ми надсилали заголовок 200 зі сторінкою входу, що створює деякі проблеми з AJAX, оскільки код запускається, якщо надсилається відповідь 200, і більшість даних, що надсилаються з цих дзвінків RPC, - це JSON або необроблений JavaScript, який оцінюється (не запитайте: |).

Я припустив, що 401 краще, оскільки наш аналог JSON не намагатиметься використовувати HTML-сторінку входу .. :)

При читанні специфікації , однак, я помітив , що WWW-Authenticateполе також має бути надіслано.

Яке хороше значення для цього поля? Буде Application Loginдостатньо?

Відповіді:


67

Вказуючи HTTP Basic Authentication, ми повертаємо щось на зразок:

WWW-Authenticate: Basic realm="myRealm"

Тоді Basicяк схема, а решта дуже залежить від цієї схеми. У цьому випадку сфера просто надає браузеру буквальне значення, яке може відображатися користувачеві під час запиту ідентифікатора користувача та пароля.

Ви, очевидно, не використовуєте Basic, оскільки немає сенсу закінчувати час сеансу, коли використовується Basic Auth. Я припускаю, що ви використовуєте певну форму аутентифікації на основі форм.

З часу згадування, Windows Challenge Response використовує іншу схему та різні аргументи.

Хитрість полягає в тому, що браузер повинен визначити, які схеми він підтримує і як він реагує на них.

Я відчуваю, що ви використовуєте автентифікацію на основі форм - залишатися зі сторінкою 200 + Relogin, але додати спеціальний заголовок, який браузер буде ігнорувати, але ваш AJAX може ідентифікувати.

Для дійсно хорошого користувачеві + AJAX досвіду знайдіть скрипт, щоб завісити на запит AJAX, який виявив, що сеанс закінчився, відключіть запит на повторну реєстрацію через спливаюче вікно, і при успіху повторно подайте оригінальний запит AJAX і продовжуйте працювати як завжди.

Уникайте шахрайства, що тільки отримує сценарій, щоб потрапляти на сайт кожні 5 хвилин, щоб зберегти сеанс в живих, що просто перемагає точку закінчення сеансу.

Інша альтернатива - запит запиту AJAX, але це поганий досвід користувача.


2
Спасибі, я зараз використовую 403, оскільки це не перенаправлення, і він буквально включає форму входу замість оригінальної сторінки. Він також краще відповідає специфікації W3. Дякую за інформацію, однак.
Буде Морган

2
Дивіться цей відповідь про те , як ви можете використовувати HTTP 401: stackoverflow.com/questions/928874 / ...
lanoxx

Так, просто покладіть що-небудь у заголовок WWW-Authenticate. Ще одна відповідь у подібній думці - stackoverflow.com/a/1088127/689161 Або просто порушувати специфікацію та не перешкоджати надсиланню заголовка (принаймні кілька сайтів роблять це); 401 все ще доречніше 403.
gengkev

Я не впевнений, що я б "просто щось поставив" у заголовку WWW-Authenticate, оскільки я не можу бути впевнений, чи запит обробляється моїм Ajax або браузером. Поза заголовком цього питання, враховуючи деталізацію, яка передбачає автентифікацію на основі форм, я б взагалі не надсилав заголовка WWW-Authenticate. Це тому, що я не прошу браузера брати участь у виклику автентифікації / довіри. Я просто хочу, щоб він показав форму, яка просто буває формою для входу, але з тим, що Ajax може використовувати для його ідентифікації, це форма для входу, щоб він міг обробляти її інакше, як вище.
Swanny

Вам слід скласти схему authn для використання із заголовком. Тоді браузер не залучатиметься, оскільки він не зрозуміє схему. Деякі клієнти засмучуються або плутаються, якщо ви не включите заголовок.
KayEss

7

Ні, вам доведеться вказати метод аутентифікації, який слід використовувати (як правило, "Basic") та область автентифікації. Див. Http://en.wikipedia.org/wiki/Basic_access_authentication за прикладом запиту та відповіді.

Ви також можете прочитати RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication .


-7

Коли час сеансу користувача закінчується, я надсилаю назад код статусу HTTP 204. Зауважте, що стан HTTP 204 не містить вмісту. З боку клієнта я роблю це:

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

Ось функція Reload ():

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

6
Чому ви використовуєте HTTP 204? developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
Буде Морган
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.