Какой код состояния http должен использоваться, чтобы сообщить клиенту, что время ожидания сеанса истекло?


На веб-странице он использует диспетчер соединений YUI/источник данных для отправки AJAX-запросов на сервер, если время сеанса (который содержит информацию о том, прошел ли пользователь проверку подлинности) уже истекло, те ответы ajax, которые могут просматривать только прошедшие проверку пользователи, должны возвращать код состояния http, сообщающий клиенту, что время сеанса уже истекло, затем клиент либо просто перенаправляет его на страницу входа в систему, либо спрашивает его, хочет ли он продлить сеанс.

Мой вопрос в том, что в этой ситуации какой код состояния http является наиболее подходящим, чтобы сообщить клиенту, что время ожидания сеанса истекло?

Список кодов состояния HTTP из вики

Author: bobo, 0000-00-00

8 answers

Лучшее, что я могу предложить, - это код состояния HTTP 401 с заголовком WWW-Authenticate.

Проблема с 403 запросы - это RFC 2616, в котором говорится: "Авторизация не поможет, и запрос НЕ ДОЛЖЕН повторяться". (т. Е. Не имеет значения, аутентифицированы вы или нет, вы никогда не получите доступ к этому ресурсу).

Проблема с 401 в запросах указано, что они "ДОЛЖНЫ включать поле заголовка WWW-аутентификации". Как у кого-то есть отмечено похоже, что использование пользовательского значения в заголовке WWW-Аутентификации не нарушает спецификацию.

Я не вижу никакой причины в RFC 2617, по которой статус HTTP 401 в сочетании с пользовательским заголовком WWW-аутентификации, подобным этому, был бы неправильным:

WWW-Authenticate: MyAuthScheme realm="http://example.com"

Спецификация OAuth на самом деле, похоже, делает именно это, поскольку они рекомендуют это (хотя, на мой взгляд, у них странная интерпретация RFC):

WWW-Authenticate: OAuth realm="http://server.example.com/"

Похоже, что это не является специально САНКЦИОНИРОВАННЫМ по RFC, но я на самом деле не вижу, что это запрещено им (похоже, это не противоречит никакому ОБЯЗАТЕЛЬНОМУ или ОБЯЗАТЕЛЬНОМУ, ДОЛЖНО или НЕ ДОЛЖНО БЫТЬ условием).

Я хотел бы, чтобы был более конкретный код состояния HTTP для тайм-аутов и для таких вещей, как недействительность токенов CSRF, чтобы это было понятнее.

 58
Author: Iain Collins, 2017-05-23 12:17:42

Я бы рекомендовал HTTP 401.

В то время как 403 в основном говорит: "Вам запрещено, уходите и не возвращайтесь", 401 говорит: "Мы не знаем, разрешено вам или нет, потому что вы не принесли свое удостоверение личности. Иди, возьми его и попробуй еще раз".

Сравните Определения Википедии:

HTTP 403 - Запрос был законным запросом, но сервер отказывается отвечать на него.

HTTP 401 - Аналогично 403 Запрещенному, но специально для использования, когда аутентификация возможна, но не удалась или еще не была предоставлена.

 27
Author: Jonathon Hill, 2012-03-02 20:22:33

Что насчет 419 - это не стандарт, но описание в Википедии, похоже, подходит:

419 Время ожидания аутентификации

Не входящий в стандарт HTTP, тайм-аут аутентификации 419 означает , что срок действия ранее действительной аутентификации истек. Он используется в качестве альтернативы 401 Несанкционированному, чтобы отличаться от клиентов, прошедших проверку подлинности иным способом, которым отказано в доступе к определенным ресурсам сервера.

 17
Author: John Reichert, 2013-07-10 11:35:05

Я полагаю, что соответствующий код будет 403/Запрещен. Нет ни одного, который был бы напрямую связан с сеансами.

 13
Author: Jason, 2009-10-31 05:35:05

Правда в том, что для тайм-аута сеанса нет стандартного кода состояния HTTP. Сеансы реализуются на прикладном уровне, а не на транспортном уровне HTTP.

Существует пользовательский код состояния, который Microsoft использует для тайм-аута сеанса: 599, или просто создайте свой собственный код состояния в диапазоне 5xx.

Из Вики-кода статуса:

Ошибка тайм-аута подключения к сети 599 (Неизвестно) Этот код состояния не указан ни в каких RFC, но используется корпорацией Майкрософт. Прокси-серверы HTTP для передачи сигнала о таймауте сетевого подключения за прокси-сервером клиенту перед прокси-сервером.

Я использую пользовательский код состояния 599 для тайм-аута сеанса, а затем проверяю его в ответе AJAX.

 10
Author: Dermot Doherty, 2012-11-29 19:40:39

Согласно ссылке Википедии Коды статуса Http, предоставленные выше Бобо:

440 Login Timeout (Microsoft)

    A Microsoft extension. Indicates that your session has expired.
 8
Author: Faisal Mq, 2014-03-18 15:45:47

Когда вы размещаете ссылку, в этой ссылке я нашел этот код состояния HTTP 440. вы можете использовать код состояния HTTP 440 для сеанса с истекшим сроком действия.

440 Время ожидания входа в систему

 The client's session has expired and must log in again.

401 Несанкционированный мы можем использовать, когда учетные данные для входа пользователя неверны. или маркер аутентификации, переданный в заголовке, недействителен.

403 Запрещено мы можем использовать это, когда у пользователя нет специального разрешения на запрашиваемый ресурс.

Поэтому, на мой взгляд, мы должны использовать 440 тайм-аут входа в систему.

 1
Author: Vinay Pandya, 2018-09-21 05:47:48

Технически принятый ответ верен: если вы уже точно знаете, что вы собираетесь отклонить запрос, и вы спрашиваете, какой код ошибки следует вернуть, то HTTP 401 "Неавторизованный (не прошедший проверку подлинности)" является подходящим, чтобы запросить повторную аутентификацию.

Но прежде всего, спросите себя: должны ли вы отклонить запрос?

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

Мой совет - игнорировать тот факт, что токен сеанса неизвестен, и просто перейти к созданию нового токена сеанса и создать для него новый сеанс. Начальное состояние сеанса, конечно, будет "еще не аутентифицировано", поэтому, если пользователь пытается получить доступ к n

 0
Author: ,