Приложение холста Facebook не сохраняет сеансы

Я сделал тестовое приложение facebook, чтобы поиграть, и я использую сеансы для хранения аутентификации. Я использую омниаут. Когда я вхожу в систему с http://fbbtest.heroku.com/, а затем обновляю страницу, сеанс все еще сохраняется, и в нем говорится, что я вошел в систему. Когда я пробую его с холста http://apps.facebook.com/herokutestapp/ он регистрирует меня, перенаправляет обратно и говорит, что я вошел в систему, но затем, когда я вручную обновляю его, он говорит, что я не вошел в систему. Есть ли что-то особенное, что я должен делать с сеансами в rails 3, чтобы он также работал на холсте facebook?

Это то, что у меня сейчас есть в моих контроллерах и представлениях

  def index

  end

  def create
    session['fb_auth'] = request.env['omniauth.auth']
    session['fb_token'] = session['fb_auth']['credentials']['token']
    session['fb_error'] = nil
    redirect_to root_path
  end

  def destroy
    clear_session
    redirect_to root_path
  end

  def failure
    clear_session
    session['fb_error'] = 'In order to use this site you must allow us access to your Facebook data<br />'
    redirect_to root_path
  end

  def clear_session
    session['fb_auth'] = nil
    session['fb_token'] = nil
    session['fb_error'] = nil
  end

Представление индекса

<div class="container">
    <h1>Heroku FB Test application</h1><br />
    <div class="center"><br />
<%=session[:fb_error]%>     
    <% if session[:fb_token] %>
      <p>
        Successfully logged in.
      </p>
      <a href='logout'>Logout</a>
    <% else %>
        <%= session[:fb_error] %><br />
            <%= link_to "Log in with Facebook", "/auth/facebook",:class => "popup", :"data-width" => 600, :"data-height" => 400 %> <br />
        <p>
            please log in
        </p>
    <% end %>
    </div>
</div>

person Kevin    schedule 21.04.2011    source источник
comment
Какой браузер вы используете? Влияет ли это на более чем один браузер?   -  person Jimmy Sawczuk    schedule 21.04.2011
comment
Извините, если вы не можете проверить это прямо сейчас. Героку не работает :(   -  person Kevin    schedule 22.04.2011
comment
На Heroku работает более 1 динамометра?   -  person mscccc    schedule 27.09.2011
comment
Вы когда-нибудь решали эту проблему?   -  person Purple Hexagon    schedule 19.07.2012


Ответы (4)


Проблема, с которой вы, возможно, сталкиваетесь, заключается в том, что обнаружение подделки Rails CSRF нарушает некоторую часть вашей аутентификации, потому что запросы поступают как HTTP-метод POST.

Первая строка в вашем ApplicationController, вероятно, выглядит примерно так:

class ApplicationController < ActionController::Base
  protect_from_forgery
  [...]

Удалите эту строку «protect_from_forgery» и посмотрите, поможет ли это решить вашу проблему. Если это окажется так, вернитесь и настройте его на более ограниченной основе (только соответствующие контроллеры, см. документацию здесь: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html )

Отличный пример того, как заставить Omniauth работать, есть на http://www.communityguides.eu/articles/16, а полный пример кода находится по адресу https://github.com/markusproske/omniauth_pure. При этом они имеют следующее:

class ServicesController < ApplicationController
  before_filter :authenticate_user!, :except => [:create, :signin, :signup, :newaccount, :failure]
  protect_from_forgery :except => :create     

Вам нужен какой-то вариант обеих этих строк, чтобы сеансы omniauth, facebook и rails хорошо работали вместе. Если это не сработает для вас, опубликуйте информацию об OmniAuth::Builder из environment/production.rb (с подробностями, удаленными XXX) и любой другой связанный код в контроллере, который вы используете для аутентификации, это будет полезно для отладки.

При разработке приложений rails с помощью facebook может быть проще отлаживать с помощью http://tunnlr.com или другого сервиса (или просто туннеля ssh http://blog.kenweiner.com/2007/09/reverse-ssh-tunnel-for-facebook.html), который позволяет запускать отладчик на локальном компьютере, очень полезен для решения подобных проблем.

person corprew    schedule 02.10.2011
comment
Есть ли недостаток в отключении protect_from_forgery для действия создания? - person oldergod; 28.02.2012
comment
старший бог: нет. rails Protect_from_forgery работает только тогда, когда он исходит из формы внутри приложения rails. Это ничего не говорит о безопасности какого-либо конкретного действия, просто методы защиты от подделки rails бесполезны. :-) - person corprew; 29.02.2012

Сессии и файлы cookie в iframe Facebook очень сложны в использовании, но не невозможны. Я сталкивался с этим несколько раз, когда пытался разработать конкурсы с голосованием один раз в день.

Решение состоит в использовании заголовков P3P. Честно говоря, я не слишком уверен, как они работают, но это уменьшает проблемы с кросс-браузерными файлами cookie в iframe, особенно в IE и Safari.

Добавьте следующее вверху каждой страницы:

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');

Это может не решить вашу проблему точно, но, надеюсь, это поможет вам на правильном пути.

person Carson    schedule 27.09.2011
comment
Это решение действительно необходимо только для Internet Explorer. Проблема, описанная выше, похоже, возникает в Firefox и Chrome. - person Tim Tisdall; 27.09.2011
comment
Заголовок P3P не является решением. Это относится только к сторонним файлам cookie в Internet Explorer в конфигурации безопасности по умолчанию. Если это проблема сторонних файлов cookie, требуется совершенно другой подход, а заголовок P3P просто запутывает проблему. - person Floyd Wilburn; 01.10.2011

Если я cookies.permanent.signed[:fb_auth], это позволяет мне вернуться в приложение в facebook без необходимости повторного входа в систему. Это лучший способ обойти сеансы, которые не работают через iFrames?

person Kevin    schedule 22.04.2011

Это похоже на проблему со сторонними файлами cookie. Вы уверены, что использование cookies.permanent.signed работает правильно, если вы зашли на сайт только через Facebook? Попробуйте очистить файлы cookie, перезапустить браузер, а затем перейти на страницу холста Facebook и повторить тестирование.

В Firefox попробуйте перейти в «Инструменты» -> «Параметры» -> «Конфиденциальность» и посмотреть, не стоит ли флажок «Принимать сторонние файлы cookie». Если это так, попробуйте проверить его и снова протестировать.

Совсем неудивительно, что сторонние файлы cookie могут вызывать у вас проблемы, запутанная часть заключается в том, почему использование постоянных файлов cookie должно иметь какое-либо значение.

Если вы подтвердите, что проблема связана со сторонними файлами cookie, я боюсь, что нет простого решения, если вы хотите, чтобы приложение было доступно для всех. Вы должны полностью прекратить использование файлов cookie и поддерживать состояние сеанса, используя только значения, переданные GET/POST.

person Floyd Wilburn    schedule 27.09.2011
comment
И под сохранением состояния сеанса с использованием только значений, переданных GET/POST, вы имеете в виду передачу собственного сгенерированного ключа сеанса всем запросам/со всеми запросами, которые приложение холста отправляет/отвечает? - person Tomasz Cudziło; 23.01.2012