Войти с помощью devise и mobile_fu неправильно перенаправляет - PullRequest
4 голосов
/ 31 октября 2011

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

I ', используя jQuery Mobile и mobile_fu для настройки мобильного представления для приложения rails3.

Devise используется для аутентификации и отлично работает в режиме рабочего стола.

Моя проблема в том, что после успешного входа в мобильном представлении приложение снова перенаправляет на форму sign_in, когда оно должно перенаправить на корневую страницу. Вход в систему правильный, и если я просто перезагружаю страницу, то перенаправление на root выполнено правильно. Последовательность следующая:

Я ввожу URL-адрес корневой страницы в мобильном устройстве Поскольку пользователь не аутентифицирован, devise перенаправляет на страницу входа Я ввожу учетные данные и нажимаю кнопку входа Вход выполнен правильно, но приложение снова перенаправляет на страницу входа Нажмите перезагрузить мобильное устройство, и затем приложение перенаправит на корневую страницу с пользователем, правильно аутентифицированным

Я следовал этим инструкциям, чтобы настроить устройство для мобильного фу, но используя формат «мобильный» вместо формата «iOS»: https://github.com/plataformatec/devise/wiki/How-To%3a-Make-Devise-work-with-other-formats-like-mobile,-iphone-and-ipad-%28Rails-specific%29

Буду признателен за любую помощь, я работал над этой проблемой пару дней, и это начинает сводить меня с ума: S Заранее спасибо!

Я прилагаю данные запросов и ответов для запросов и ответов мобильных и настольных компьютеров при входе в систему:

Настольный логин

Запрос

POST / users / sign_in HTTP / 1.1 Хост: localhost: 3000 User-Agent:

Mozilla / 5.0 (Macintosh; Intel Mac OS X 10.7; версия 7.0.1) Gecko / 20100101

Firefox / 7.0.1 Принять:

Текст / HTML, приложение / XHTML + XML, приложение / XML; д = 0,9, * * тысяча тридцать-один / * * один тысяча тридцать две; д = 0,8

Accept-Language: es-es, es; q = 0,8, en-us; q = 0,5, en; q = 0,3 Accept-Encoding:

gzip, выкачать Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7

Соединение: keep-alive Реферер: http://localhost:3000/users/sign_in

Cookie: _PMG_session = BAh7CkkiCmZsYXNoBjoGRUZJQzolQWN0aW9uRGlzcGF0Y2g6OkZsYXNoOjpGbGFzaEhhc2h7BjoKYWxlcnRJIkJOZWNlc2l0YXMgaW5pY2lhciBzZXNpw7NuIGNvbiB0dSBjdWVudGEgcGFyYSBwb2RlciBjb250aW51YXIuBjsAVAY6CkB1c2VkbzoIU2V0BjoKQGhhc2h7BjsHVEkiD3Nlc3Npb25faWQGOwBGIiViZjlkZDc4NzczMmFmMGViNjcyOWRkNzAxNWJhMzQ5YkkiEG1vYmlsZV92aWV3BjsARkZJIhN1c2VyX3JldHVybl90bwY7AEZJIgYvBjsARkkiEF9jc3JmX3Rva2VuBjsARkkiMWEyZW9oamFKT2tsWEZrbzZxc3lNenRhWTVEUk5XaHVUdm9iV3J3aFhFK1E9BjsARg% 3D% 3D - 6623519d539757216a03d212a4e20647e8a5029c; jstree_open =% 231% 2C% 234% 2C% 235; jstree_load =

Ответ

HTTP / 1.1 302 Найдено расположение: http://localhost:3000/ Тип содержимого:

текст / html; charset = utf-8 Cache-Control: без кеширования X-UA-совместимый:

IE = Edge X-Runtime: 1.650766 Сервер: WEBrick / 1.3.1

(Ruby / 1.9.2 / 2011-02-18) Дата: понедельник, 31 октября 2011 года, 08:58:24 GMT

Контент-длина: 88 Соединение: Keep-Alive Set-Cookie: _PMG_session = BAh7CkkiCmZsYXNoBjoGRUZJQzolQWN0aW9uRGlzcGF0Y2g6OkZsYXNoOjpGbGFzaEhhc2h7BjoLbm90aWNlSSIoSGFzIGluaWNpYWRvIHNlc2nDs24gY29ycmVjdGFtZW50ZS4GOwBUBjoKQHVzZWRvOghTZXQGOgpAaGFzaHsASSIQbW9iaWxlX3ZpZXcGOwBGRkkiEF9jc3JmX3Rva2VuBjsARkkiMWEyZW9oamFKT2tsWEZrbzZxc3lNenRhWTVEUk5XaHVUdm9iV3J3aFhFK1E9BjsARkkiGXdhcmRlbi51c2VyLnVzZXIua2V5BjsAVFsISSIJVXNlcgY7AEZbBmkGSSIiJDJhJDEwJEZQL20vZ29KU2FGUFZ0bmRzb0VZeS4GOwBUSSIPc2Vzc2lvbl9pZAY7AEYiJTA1NzI5YjFjOTMyZDdlMjk3YjEwYWQ5NWU3ZDJkZjYx - 889ba65c483c3757b6aa47ffc2e187ac27a04dbe; Путь = /; HttpOnly

Мобильный логин

Запрос

POST / users / sign_in HTTP / 1.1

Хост: localhost: 3000

User-Agent: Mozilla / 5.0 (iPhone; U; процессор iPhone OS 3_0, как Mac OS X; ru-ru) AppleWebKit / 528.18 (KHTML, как Gecko) Версия / 4.0 Mobile / 7A341 Safari / 528,16

Принять: текст / html, / ; д = 0,01

Accept-Language: es-es, es; q = 0,8, en-us; q = 0,5, en; q = 0,3

Accept-Encoding: gzip, deflate

Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7

Соединение: keep-alive

Content-Type: application / x-www-form-urlencoded; кодировка = UTF-8

X-Requested-With: XMLHttpRequest

Рефери: http://localhost:3000/users/sign_in.mobile

Длина содержимого: 195

Cookie: jstree_open =% 231% 2C% 234% 2C% 235; jstree_load =; _PMG_session = BAh7CkkiCmZsYXNoBjoGRUZJQzolQWN0aW9uRGlzcGF0Y2g6OkZsYXNoOjpGbGFzaEhhc2h7BjoKYWxlcnRJIkJOZWNlc2l0YXMgaW5pY2lhciBzZXNpw7NuIGNvbiB0dSBjdWVudGEgcGFyYSBwb2RlciBjb250aW51YXIuBjsAVAY6CkB1c2VkbzoIU2V0BjoKQGhhc2h7BjsHVEkiD3Nlc3Npb25faWQGOwBGIiUwMjY0ZGFkODY2MGY3YmE5ZWY4NmQzYmRmODUyNDUxOEkiEG1vYmlsZV92aWV3BjsARlRJIhN1c2VyX3JldHVybl90bwY7AEZJIgYvBjsARkkiEF9jc3JmX3Rva2VuBjsARkkiMTN5am1kaUhZcWpEZTAyclNNZ05ZNU5aZjA4bG5mamxCZHR6UmlVVHpkNFk9BjsARg% 3D% 3D - a6c9dbd6b27ac1b43193b4cba901b8862046dacf Прагма: без кэширования Cache-Control: без кэширования

Ответ

HTTP / 1.1 200 OK

Content-Type: text / html; кодировка = UTF-8

Этаж: "22b69d3da00b31c705b66d95aa8a32de"

Cache-Control: max-age = 0, private, must-revalidate

X-UA-совместимый: IE = Edge

X-Runtime: 1.317610

Сервер: WEBrick / 1.3.1 (Ruby / 1.9.2 / 2011-02-18)

Дата: понедельник, 31 октября 2011 г. 09:06:47 GMT

Длина содержимого: 2915

Соединение: Keep-Alive

Set-Cookie: _PMG_session = BAh7C0kiCmZsYXNoBjoGRUZJQzolQWN0aW9uRGlzcGF0Y2g6OkZsYXNoOjpGbGFzaEhhc2h7BjoLbm90aWNlSSIoSGFzIGluaWNpYWRvIHNlc2nDs24gY29ycmVjdGFtZW50ZS4GOwBUBjoKQHVzZWRvOghTZXQGOgpAaGFzaHsASSIQbW9iaWxlX3ZpZXcGOwBGVEkiEF9jc3JmX3Rva2VuBjsARkkiMTN5am1kaUhZcWpEZTAyclNNZ05ZNU5aZjA4bG5mamxCZHR6UmlVVHpkNFk9BjsARkkiCWxpbmUGOwBGSSIGNQY7AFRJIhl3YXJkZW4udXNlci51c2VyLmtleQY7AFRbCEkiCVVzZXIGOwBGWwZpBkkiIiQyYSQxMCRGUC9tL2dvSlNhRlBWdG5kc29FWXkuBjsAVEkiD3Nlc3Npb25faWQGOwBGIiVhYWNkYzNlNjNhODU2ZWVjNmY1YmYzODEwNTk3NDA5Zg% 3D% 3D - 31e22835ee0e428f80e0cf3f3ce5bd9fc8134d20; Путь = /; HttpOnly

Ответы [ 5 ]

2 голосов
/ 31 октября 2011

Мне удалось решить проблему. Может быть, я должен был попросить, прежде чем вдохновение работает :)

Очевидно, Devise не смог правильно перенаправить, когда формат запроса не был HTML. К сожалению, я полагался на формат для обслуживания различных шаблонов для мобильного устройства, использующего mobile_fu, и форсировал формат запроса, как предложено вики-разработчиком , чтобы он работал правильно с jquery mobile.

Решение, которое я нашел, уродливо: Когда пользователь отправляет запрос POST на контроллер устройства, когда он пытается аутентифицироваться, я включаю формат html вместо мобильного. Таким образом, Devise сможет правильно выполнить перенаправление.

Код для ApplicationController Класс:

before_filter :set_mobile_format

def set_request_format
  if is_mobile_device? # this method is provided by mobile_fu
    if (devise_controller? && action_name == 'create' && request.method == ('POST'))
      request.format = :html
    else
      request.format = :mobile
    end
  end
end

Надеюсь, это поможет любому, кто столкнется с той же проблемой.

Более элегантные решения приветствуются!

1 голос
/ 27 июля 2012

Переопределите SessionsController для devise и передайте ему mobile_fu:

class Users::SessionsController << Devise::SesssionsController
    has_mobile_fu
end

И в маршрутах:

devise_for :users, :controllers => { :sessions => "users/sessions" }

Это должно работать для mobile_fu 1.1, devise 2.1.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 22 января 2014

Фактическое решение относительно простое и настраивается в инициализаторе.

ТЛ; др

Когда вы используете authenticate_user !, он вызывает драгоценный камень надзирателя, чтобы проверить, вошел ли пользователь в систему. Если пользователь не вошел в систему, драгоценный камень надзирателя дает сбой и вызывает его fail_app.

Когда запрос имеет формат xhr, devise по умолчанию устанавливает сбой обработки приложением сбоя, поэтому запрос AJAX может быть хорошим, чистым сбоем. Тем не менее, вы не хотите этого с JQuery Mobile. Вы хотите новый HTTP-запрос, чтобы отправить вас на правильную страницу.

/ Т.Л., др

В вашем инициализаторе (config / initializers / devise.rb) раскомментируйте и измените с true на false:

 config.http_authenticatable_on_xhr = false

Наслаждайтесь !!

0 голосов
/ 11 ноября 2013

Чтобы обнаружить серверный пользовательский агент без изменения формата запроса, взгляните на mobu . Драгоценный камень похож на mobile-fu, но без изменений формата.

0 голосов
/ 26 января 2012

Единственное, что вам нужно, это просто следовать руководству по Devise Wiki. Я решил ту же проблему, сделав это прямо сейчас!

Однако в моем коде есть 2 разные настройки:

  1. Я использую has_mobile_fu (встроенный в Mobile-Fu) вместо пользовательского before_filter adjust_format_for_iphone, вам не нужно это перед фильтром;
  2. Я использую .mobile.erb вместо .ios.erb.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...