Как обрабатывать страницы с устаревшими токенами аутентификации CSRF в Rails

В нашем приложении Rails пользователи часто держат открытыми несколько вкладок браузера в течение нескольких часов или дней. Проблема возникает, когда на одной из этих вкладок пользователь выходит из системы, а затем снова входит в нее (или срок действия сеанса истекает и создается новый сеанс).

Это приводит к тому, что токены аутентификации CSRF на всех других вкладках становятся недействительными. Если они попытаются отправить любую форму или сделать какой-либо ajax-запрос на этих вкладках без обновления, они получат сообщение об ошибке (и фактически выйдут из системы, потому что это поведение Rails по умолчанию, когда передается неверный токен аутентификации).

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

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

Решение, которое приходит на ум, состоит в том, чтобы иметь некоторый javascript, который либо опрашивает сервер, чтобы проверить, изменился ли токен аутентификации, либо опрашивает файлы cookie пользователя, чтобы проверить, изменился ли сеанс. Я никогда не слышал, чтобы кто-то делал что-либо из этого, поэтому я хотел узнать, что думает сообщество.


person Jacob    schedule 04.05.2012    source источник


Ответы (2)


Прежде всего: вход/выход/вход не приведет к появлению нового csrf-токена. Он по-прежнему будет сохранен в файле cookie пользователя. В следующий раз, когда он войдет в систему через тот же браузер, он получит тот же токен.

В последних версиях Rails в случае неправильного токена не будет выдаваться никаких ошибок: все, что делает Rails — просто сбрасывает сеанс перед передачей его контроллеру.

Итак, обновите свой Rails, и вы получите на одну боль меньше.

person jdoe    schedule 04.05.2012
comment
Вы правы, вход/выход не вызывает генерацию нового токена csrf. Похоже, он вернулся к чертежной доске, чтобы выяснить, откуда берутся эти недопустимые ошибки токена. - person Jacob; 04.05.2012
comment
Что делать, если обновление Rails невозможно? - person Wylliam Judd; 21.12.2018

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

person Tgr    schedule 04.05.2012
comment
Можете ли вы уточнить, как вы можете рассматривать несоответствие csrf как ошибку проверки? Есть ли способ Rails-y сделать это вообще? - person Jacob; 04.05.2012
comment
Я не очень хорошо знаком с Rails, но это кажется, это один из способов. - person Tgr; 05.05.2012