HTTP 401 - что такое подходящее значение заголовка WWW-Authenticate? - PullRequest
99 голосов
/ 17 ноября 2009

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

Все сделанные запросы направляются через этот механизм, который включает вызовы AJAX. Первоначально мы отправляли заголовок 200 со страницей входа, что создает некоторые проблемы с AJAX, так как код запускается, если отправляется ответ 200, и большая часть данных, возвращаемых из этих вызовов RPC, представляет собой JSON или необработанный JavaScript, который оценивается спроси: |).

Я предположил, что 401 лучше, так как наш анализатор JSON не будет пытаться использовать страницу входа в HTML ...:)

Однако, когда читает спецификацию , я заметил, что поле WWW-Authenticate также должно быть отправлено.

Что является хорошим значением для этого поля? Хватит ли Application Login?

Ответы [ 3 ]

63 голосов
/ 17 ноября 2009

При указании базовой аутентификации HTTP мы возвращаем что-то вроде:

WWW-Authenticate: Basic realm="myRealm"

Принимая во внимание, что Basic является схемой, а остаток очень сильно зависит от этой схемы. В этом случае область просто предоставляет браузеру литерал, который может отображаться пользователю при запросе идентификатора пользователя и пароля.

Однако вы явно не используете Basic, поскольку нет смысла истекать сессию при использовании Basic Auth. Я предполагаю, что вы используете некоторую форму аутентификации на основе форм.

Исходя из воспоминаний, Windows Challenge Response использует другую схему и другие аргументы.

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

Мне кажется, что если вы используете аутентификацию на основе форм, вы должны оставаться на странице 200+ relogin, но добавить собственный заголовок, который браузер будет игнорировать, но ваш AJAX может его идентифицировать.

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

Избегайте читов, которые просто заставляют скрипт попадать на сайт каждые 5 минут, чтобы поддерживать сеанс в живых, потому что он просто побеждает точку истечения сеанса.

Другой вариант - записать запрос AJAX, но это плохо для пользователя.

6 голосов
/ 17 ноября 2009

Нет, вам нужно указать используемый метод аутентификации (обычно «Базовый») и область аутентификации. См. http://en.wikipedia.org/wiki/Basic_access_authentication для примера запроса и ответа.

Возможно, вы также захотите прочитать RFC 2617 - Аутентификация HTTP: обычная и дайджест-аутентификация доступа .

0 голосов
/ 20 января 2017

Когда время сеанса пользователя истекло, я отправляю обратно код состояния HTTP 204. Обратите внимание, что состояние HTTP 204 не содержит содержимого. На стороне клиента я делаю это:

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

Вот функция перезарядки ():

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