Приложение на холсте Facebook не сохраняет сессии - PullRequest
6 голосов
/ 21 апреля 2011

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

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

  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>

Ответы [ 4 ]

9 голосов
/ 02 октября 2011

Проблема, с которой вы, возможно, сталкиваетесь, заключается в том, что обнаружение подделки в 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,Фейсбук и рельсовые сессии хорошо играют вместе.Если это не сработает для вас, опубликуйте свою информацию OmniAuth :: Builder из environment / production.rb (с подробностями XXXed вне) и любой другой связанный код в контроллере, который вы используете для аутентификации, это будет полезно для отладки этого.

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

1 голос
/ 27 сентября 2011

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

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

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

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

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

0 голосов
/ 28 сентября 2011

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

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

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

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

0 голосов
/ 22 апреля 2011

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

...