RoR: AuthenticatedSystem неправильно перенаправляет обратно в Safari - PullRequest
0 голосов
/ 21 мая 2009

Я бьюсь головой об этом уже пару дней:

У меня есть приложение RoR, использующее AuthenticatedSystem и требующее аутентификацию для некоторых ресурсов. Before_filter проверяет, вошел ли пользователь в систему. Если нет, он захватывает request.request_uri и помещает его в переменную сеанса (session [: return_to]), а затем отправляет пользователя на страницу входа через сообщение перенаправления 302. Затем после входа в систему пользователь перенаправляется обратно на URL в сеансе [: return_to].

Это прекрасно работает в IE и Firefox. В Safari request.request_uri для начального before_filter пуст, и контроллер сеанса всегда перенаправляет на главную страницу.

Кто-нибудь сталкивался с этим раньше? Единственная подсказка, которую я имею, - то, что Веб-инспектор для Safari даже не показывает запрос на начальную страницу, только запрос на вход в систему. В Firefox я вижу оба запроса.

Вот фильтр before_:

def login_required
  if !authorized?
    session[:return_to] = request.request_uri
    redirect_to new_session_path
  end
end

Вот сеанс / создание:

def create
  self.current_user = User.authenticate(params[:login], params[:password])
  if logged_in?
    if params[:remember_me] == "1"
      current_user.remember_me unless current_user.remember_token?
      cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
    end
    redirect_back_or_default('/')
    flash[:notice] = "Logged in successfully"
  else
    flash.now[:error] = "Authentication failed."
    render :action => 'new'
  end
end

Есть идеи?

1 Ответ

0 голосов
/ 21 мая 2009

Так, на всякий случай, если кто-нибудь столкнется с этим ...

Ответ, похоже, заключается в агрессивной блокировке Safari сторонних файлов cookie. Эта ошибка возникала в букмарклете, который в основном представляет собой iframe, добавляемый в DOM стороннего веб-сайта, когда пользователь решает использовать его (не волнуйтесь, это для чего-то похожего на букмарклет FriendFeed - в основном это способ добавления пользователями контента с других сайтов, не покидая этих сайтов).

В любом случае, в этих обстоятельствах Safari рассматривает cookie-файл сеанса, который Rails пытается установить как сторонний, даже если он устанавливается изнутри iframe. Таким образом, при перенаправлении все переменные сеанса теряются.

Представляются два возможных решения

  • сказать пользователям разрешить сторонние куки (не устраивает этот параметр)
  • передать URL-адрес return_to вместе с данными формы и извлечь их в контроллере сеанса (лучший вариант)
...