Authlogic Facebook Connect Snafu

时间:2010-03-08 21:06:56

标签: ruby-on-rails facebook authlogic

我有一个使用authlogic和authlogic_facebook_connect配置的应用程序,但每次单击“连接”按钮时,我的UserSession都无法验证,说“您没有提供任何身份验证的详细信息”

authlogic_facebook_connect是不是应该绕过登录/密码验证?我错过了一些配置步骤吗?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

嘿,也许我可以帮忙解决这个问题,不久前就遇到过这个问题......

Facebook连接已过时。所有酷孩子现在都在使用带有OAuth的Facebook Graph。 Facebook团队甚至关闭了Facebook Connect的文档。

无论如何,这适用于Authlogic Facebook连接,它根本不起作用。

最后,我一直使用Authlogic进行正常登录和帐户管理,但对于Facebook连接,我编写了自己的代码。

您可能使用过facebooker gem。卸载该gem,但保留config / facebooker.yml文件。

试试这个:

  1. 通过在config / initializers / load_config.rb中添加此代码继续使用config / facebooker.yml(您需要创建此文件)

    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中添加此代码:

  3. 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)中添加find方法:
    2.       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'} %>

      2. <强>解释

        1. 在第一步中,您创建了一个文件以从facebooker.yml
        2. 获取配置数据
        3. 在第二步中,您基本上创建了两个函数,一个用于将用户发送到Facebook站点(create_facebook),另一个用于捕获回调数据(facebook_oauth_callback),该想法来自此页面:http://www.wisejive.com/2010/05/facebook-oauth-on-rails.html
        4. 在第三步中,您刚刚在User模型中添加了一个方法,用于根据Facebook返回的信息查找或创建新用户(如果没有找到)。
        5. 代码仅适用于我的项目,不要只是复制粘贴它,而是逐行学习。随着时间的推移,我意识到最好使用你能理解的简单代码,而不是使用其他复杂的插件,当出现问题时你无法修复它......

答案 1 :(得分:0)

我有这个问题,我认为我的问题出在我的电话

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

注意我必须传入控制器。无论如何,我认为这是我的解决方案,现在我正在进行另一个问题,我正在使用facebook验证确定,但每次都在我的网站上创建一个新用户。