LINUX.ORG.RU

авторизоваться и продолжить - REST

 ,


1

1

В прекрасной программе Lotus Notes (да и в обычном sudo) есть такая киллер-фича: если со времени прошлой проверки, что я - это я, прошло достаточно времени, то программка в произвольном месте делает

await а-ну-ка-введи-логин-снова()
И продолжает работу.

Теперь представим себе ситуацию. Я делаю форум, в котором хочу такую фичу. Допустим, каждые 60 минут сессия пользователя закрывается. И вот, он сидел, писал комментарий, нажал «отправить». Ушёл POST-запрос на сервер. Возможно, это ajax, а может быть, подразумевается redirect после выполнения записи в БД постов. Но оказывается, что пора проверить логин. По сути это будет означать последовательность запросов - нужно сначала отложить в карман отправленный пользователем комментарий, затем заставить его ввести пароль, и затем отправить текст пользователя повторно.

Вопрос такой: можно ли сделать это без большого усложнения клиента?

(я чайник в веб-технологиях, может быть, спрашиваю полный бред).

★★★★★

Интересный момент.

Касаемо вопроса, можно так реализовать по сути: можно просто открывать дополнительный слой формы авторизации.

anonymous ()

На сервере можно сделать подобное. К примеру принимаешь POST /add-comment и видишь, что пользователь не аутентифицирован. Сохраняешь весь запрос, например, в /tmp/123 и отправляешь пользователю редирект на страницу аутентификации вида HTTP 302 Location: /login?return-post=123. Пользователь загружает эту страницу, при сабмите формы параметр return-post тоже посылается. После успешной аутентификации на сервере подменяется текущий запрос сохранённым и продолжается выполнение как с изначального момента. Если у тебя AJAX-запросы, тут даже проще - просто клиентский код должен повторить запрос после аутентификации, напиши какой-то общий транспортный код для обработки этой ситуации и всё.

Legioner ★★★★★ ()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

Проще в мапу сложить. И надо наверно ещё о безопасности подумать. Если будут приниматься посты от кого угодно, то могут через этот временное хранилище завалить.

deadlynch ()
Ответ на: комментарий от deadlynch

Ну да, хранить на сервере я думал, и про завалить тоже сразу подумал. Можно попробовать частично защититься так:

- ограничить число сессий N, которые может одновременно иметь каждый пользователь.

- хранить N последних сессий каждого пользователя на сервере, уже после того, как они закрылись. Получается O(число пользователей, имеющих аккаунт).

- при приёме протухшего запроса проверять, что его сессия - одна из этих N. Правда, если он напишет коммент, не отправит его, затем перейдёт на другое устройство, на нём N раз выйдет и зайдёт , а через два часа вернётся на первое устройство и попробует отправить коммент, то всё равно ему будет отказано и текст будет потерян.

Ну и другой вариант для AJAX - это просто сначала отправить запрос «обнови сессию». Если сессия протухла, то отправка сообщения с клиента не происходит, а вместо этого открывается форма логина (поверх существующей, это ж вроде можно). Если же сессия не протухла, то она продлевается на час и тогда мы смело отправляем уже основной запрос.

Можно и повторять, но это как-то менее красиво на вид.

Для чистого html такой способ не сработает, но ведь аскеты должны быть готовы к такой мелкой неприятности :)

den73 ★★★★★ ()
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от den73

Ну как то так и есть всё.

Если у тебя обычное для наших дней js приложение, я бы сделал как ты описал (я правда не понял, это ли ты имел ввиду, поэтому на всякий случай):

-- проверить на клиенте, не протухла ли сессия
-- если протухла, запускаем авторизацию (кажем окошко в первую очередь)
-- посылаем данные
-- если с сервера пришёл код «а у вас протухло», идём на пункт «если протухла»

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

вообще на вотрой раз (сервер ответил что вы неавторизованы) надо вешать обработчик где то в корне своих утилит для работы с сетью. и посылать евент кому надо.

AndreyKl ★★★★★ ()

Сейчас писал в приват на хабре и произошло вот что:

я написал сообщение, нажал отправить, форма перегрузилась, но мое сообщение не было отправлено, а так и было заполнено поле ввода. Я скопировал сообщение, обновил страницу, меня перебросило на форму авторизации. Я успешно залогинился, перебросило в ту форму диалога. Вставил из буфера сообщение и отправил.

Вот такой вариант развития событий мне кажется очень удобным, только нужна надпись «сохраните данные и перелогиньтесь». И осталось придумать, как это сделать на Spring+Security, который автоматом перебрасывает на форму авторизации и обратно при разлогине.

bvn13 ★★★★★ ()
Ответ на: комментарий от Deleted

это - да. но спринг автоматически переадресовывает на форму авторизации. а на хабре другое поведение: если не авторизован при POST запросе, то он возвращает на ту же форму, с которой был запрос, все поля заполнены.

bvn13 ★★★★★ ()