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

#ruby-on-rails #ruby #facebook #omniauth

#ruby-on-rails #ruby #Facebook #omniauth

Вопрос:

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

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

   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>
  

Комментарии:

1. Какой браузер вы используете? Влияет ли это более чем на один браузер?

2. Извините, если вы не можете протестировать его прямо сейчас. Heroku не работает : (

3. У вас на Heroku запущено более 1 dyno?

4. Вы когда-нибудь решали эту проблему?

Ответ №1:

Проблема, с которой вы, возможно, столкнулись, заключается в том, что обнаружение подделки 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 (с выделенными деталями) и любой другой связанный код в контроллере, который вы используете для аутентификации, это будет полезно для отладки этого.

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

Комментарии:

1. Есть ли какой-либо недостаток в отключении protect_from_forgery для действия create?

2. старый бог: нет. rails protect_from_forgery выполняет работу только тогда, когда она поступает из формы внутри приложения rails. Это ничего не говорит о безопасности какого-либо конкретного действия, просто методы защиты от подделки rails бесполезны. 🙂

Ответ №2:

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

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

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

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

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

Комментарии:

1. Это решение действительно необходимо только для Internet Explorer. Вышеуказанная проблема, похоже, возникает в Firefox и Chrome.

2. Заголовок P3P не является решением. Это относится только к сторонним файлам cookie в Internet Explorer в конфигурации безопасности по умолчанию. Если это проблема со сторонними файлами cookie, требуется совсем другой подход, а заголовок P3P просто запутывает проблему.

Ответ №3:

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

Ответ №4:

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

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

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

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

Комментарии:

1. И под «поддерживать состояние сеанса, используя только значения, переданные GET / POST», вы имеете в виду передачу вашего собственного сгенерированного ключа сеанса всем запросам, которые отправляет / на которые отвечает приложение canvas?