Rails3 + OpenID == мммммм; Rails3 + JQGrid == ммммммм; Rails3 + OpenID + JQGrid == BZZZT
Попытка использовать виджеты JQuery, в частности JQGrid, с приложением Rails 3. Я использую ruby-openid для аутентификации в Google и использовал хороший рецепт Сета Лэдда, чтобы заставить его работать.
Что он делает - для просмотров страниц и постов из веб-форм.
Однако всякий раз, когда JQGrid выполняет POST для обновления данных на сервере, происходят две вещи:
Даже если браузер пользователя уже прошел проверку подлинности с помощью входа в Google, POST отображается на сервере, как если бы он был получен от не прошедшего проверку подлинности, и перенаправляется на танец аутентификации OpenID. Это не было бы развлечением, за исключением того, что
Как только сервер отправляет обратно 401, который должен инициировать перенаправление и аутентификацию, вся энчилада просто останавливается. Обычно (как, скажем, в POST-запросе от отправки формы) браузер видит 401, считывает вложенную информацию "аутентифицироваться здесь", выполняет танец, возвращается с настроенным сеансом и цикл продолжается. Но из JQuery/JQGrid... не так уж и много.
Есть идеи? Я уверен, что упускаю что-то очевидное здесь, но у меня есть один из "неизвестных неизвестных" Рамсфелда, я не знаю, что я пропускаю, тем более, как это исправить! Похоже, это должно быть давно решенной проблемой, а?
Я мог бы столкнуться с защитой XSS, но если это так, я не знаю, как действовать дальше, чем ** - за счет серьезных инвестиций, которые мы уже сделали в OpenID (включая пользователей, которые уже зарегистрировались и должны предоставить / запомнить пароли -- Ик!).
Заранее спасибо, мои коллеги-эксперты.
(Rails 3.0.7, ruby-openid 2.1.8, JQGrid 3.5.3, JQuery 1.3.2, использующий Google в качестве OP, чтобы пользователю никогда не приходилось вводить свой идентификационный URL.)
1 ответ
Хорошо, дальнейшее тестирование подтверждает, что это упаковка, дамы и господа.
Конечно, тогда мне пришлось выяснить, как заставить Javascript работать с protect_from_forgery, но оказалось, что это действительно просто, вы просто берете токен аутентификации и включаете его во все запросы Ajax, как подробно описано на http://henrik.nyh.se/2008/05/rails-authenticity-token-with-jquery. Очень изящно, поскольку этот метод автоматически встраивает токен во все, вам не нужно искать все ваши POST-запросы.
Олег, спасибо за помощь. И я приму ваш совет.
Спасибо также Санте в списке рассылки OpenID Code, который дал мне указатель на заголовок protect_from_forgery.