HTTP 401 - какое значение заголовка WWW-Authenticate подходит?

109

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

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

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

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

Какое значение имеет это поле? Хватит Application Login?

Уилл Морган
источник

Ответы:

67

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

WWW-Authenticate: Basic realm="myRealm"

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

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

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

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

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

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

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

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

Swanny
источник
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
Вы должны составить схему аутентификации для использования с заголовком. Тогда браузер не будет вмешиваться, потому что не поймет схему. Некоторые клиенты расстраиваются или сбиваются с толку, если вы не включаете заголовок.
KayEss
7

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

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

Пэр Вислендер
источник
-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
Уилл Морган