Authlogic Facebook Connect Snafu

У меня есть приложение, настроенное с помощью authlogic и authlogic_facebook_connect, но каждый раз, когда я нажимаю кнопку «Подключиться», мой сеанс UserSession не проходит проверку, говоря: «Вы не предоставили никаких данных для аутентификации»

Разве authlogic_facebook_connect не должен обходить аутентификацию по логину / паролю? Я пропустил какой-то шаг настройки?

Любая помощь будет оценена по достоинству!


person a10s    schedule 08.03.2010    source источник
comment
Вы чего-нибудь добились с этим?   -  person Codebeef    schedule 16.03.2010
comment
Нет, когда я вернусь к этому, я попробую вместо этого github.com/GICodeWarrior/authlogic_facebook из github.com/kalasjocke/authlogic_facebook_connect Надеюсь, в долгосрочной перспективе это сработает.   -  person a10s    schedule 18.03.2010


Ответы (2)


Эй, может я смогу помочь с этим, только недавно была эта проблема ...

Подключение к Facebook устарело. Все крутые ребята теперь используют Facebook Graph с OAuth. Команда Facebook даже закрыла документацию для Facebook Connect.

В любом случае, это касается подключения Authlogic Facebook, оно просто больше не работает.

В конце концов, я продолжал использовать Authlogic для обычного входа в систему и управления учетной записью, но для подключения к Facebook я написал свой собственный код.

Скорее всего, вы использовали драгоценный камень facebooker. Удалите этот гем, но сохраните файл config / facebooker.yml.

Попробуй это:

  1. Продолжайте использовать config / facebooker.yml, добавив этот код в config / initializers / load_config.rb (вам нужно создать этот файл)

    config = YAML.load_file("#{Rails.root}/config/facebooker.yml") || {}

    facebook_config = config['common'] || {}

    facebook_config.update(config[Rails.env] || {})

    FB_CONFIG = facebook_config.symbolize_keys

  2. Добавьте этот код в свой user_controller.rb:

def facebook_oauth_callback
  if not params[:code].nil?
    callback = url_for(:host => APP_CONFIG[:host], :controller => 'gallery/user', :action => 'facebook_oauth_callback')
    url = URI.parse("https://graph.facebook.com/oauth/access_token?client_id=#{FB_CONFIG[:application_id]}&redirect_uri=#{callback}&client_secret=#{FB_CONFIG[:secret_key]}&code=#{CGI::escape(params[:code])}")
    http = Net::HTTP.new(url.host, url.port) http.use_ssl = (url.scheme == 'https') tmp_url = url.path + "?" + url.query
    request = Net::HTTP::Get.new(tmp_url)
    response = http.request(request)
    data = response.body
    access_token = data.split("=")[1]
    if access_token.blank?
      flash[:notice] = 'An error occurred while connecting through Facebook, please try again later.' 
    else
      url = URI.parse("https://graph.facebook.com/me?access_token=#{CGI::escape(access_token)}")
      http = Net::HTTP.new(url.host, url.port)
      http.use_ssl = (url.scheme == 'https')
      tmp_url = url.path + "?" + url.query
      request = Net::HTTP::Get.new(tmp_url)
      response = http.request(request)
      user_data = response.body
      user_data_obj = JSON.parse(user_data)
      @user = User.new_or_find_by_facebook_oauth_access_token(access_token, {:user_data => user_data_obj})

      if @user.new_record?
        session[:user] = @user
        session[:external_app] = "Facebook"
        redirect_to(:action => 'new_details')
      else
        user_session = UserSession.create(@user)
        flash[:notice] = "Successfully logged in."
        redirect_back_or_default root_url
      end
    end
  end
end

def create_facebook
  redirect_to("https://graph.facebook.com/oauth/authorize?client_id=#{FB_CONFIG[:application_id]}&redirect_uri=" + 
    url_for(:host => APP_CONFIG[:host], :controller => 'gallery/user', :action => 'facebook_oauth_callback') + 
    "&scope=email,offline_access")
end
  1. Добавьте метод поиска в свою модель пользователя (app / models / user.rb):
      def self.new_or_find_by_facebook_oauth_access_token(access_token, options = {})
        user = User.find_by_facebook_oauth_access_token(access_token)
        if user.blank?
          #code to create new user here
        end
        user
      end
  1. Добавьте ссылку на действие create_facebook в представлении, например

    <%= link_to image_tag('gallery/button-facebook.png', :title => "register with Facebook", :alt => "register with Facebook"), {:action => 'create_facebook'}, {:target => '_parent'} %>

Объяснение

  1. На первом этапе вы создали файл для получения данных конфигурации из facebooker.yml.
  2. На втором этапе вы в основном создали две функции, одну для отправки пользователя на сайт facebook (create_facebook), а другую для захвата данных обратного вызова (facebook_oauth_callback), идея была с этой страницы: http://www.wisejive.com/2010/05/facebook-oauth-on-rails.html
  3. На третьем шаге вы просто добавили метод внутри модели User для поиска или создания нового пользователя, если он не найден, на основе информации, возвращенной из facebook.

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

person jaycode    schedule 15.11.2010
comment
Спасибо, jaycode, сейчас я использую OAuth2, что не дало мне никаких проблем. - person a10s; 19.11.2010

У меня была эта проблема, я думаю, что моя проблема заключалась в моем звонке в

<%= authlogic_facebook_login_button :controller => 'account', :js => :jquery %>

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

person Pauly    schedule 07.09.2010