Authlogic Facebook Connect Snafu - PullRequest
       6

Authlogic Facebook Connect Snafu

8 голосов
/ 09 марта 2010

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

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

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

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010

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

Подключение к 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.

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

0 голосов
/ 07 сентября 2010

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

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

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

...