用于在Sinatra中使用Ruby Koala gem的网站的Facebook Graph API

时间:2015-10-28 11:44:03

标签: ruby facebook-graph-api sinatra koala

我想为网络应用实施Facebook登录。我需要的只是用户创建帐户的基本公共信息。

这就是我所做的:

  1. 创建了几乎没有自定义权限的基本Facebook应用。
  2. 使用APP_ID中的APP_SECRETKoala获取access_token
  3. 一切都很完美,我可以登录/退出。
  4. 我能做的唯一信息是:graph.get_object('me')是登录用户的名字和id(它看起来不像默认的Facebook ID)。< / LI>
  5. 对于新API中的某些内容是否发生了变化感到惊讶,我使用图表浏览器中的access_token在控制台中测试了gem(默认情况下启用了所有权限)。我使用相同的方法调用获取所有数据。
  6. 当我查看注册时所有应用获得的内容时;我看到应用程序可以访问用户的基本信息,个人资料照片和其他公共数据。
  7. 知道为什么会这样吗?看来我遗漏了一些明显的东西。该代码在Github中提供。但这几乎是它的一切:

    require 'bundler'
    Bundler.require :default
    Dotenv.load '.env'
    require_relative './app/constants.rb'
    
    module Banana
      class App < Sinatra::Base
        use Rack::Session::Cookie, secret: COOKIE_SECRET
        set :public_folder, File.dirname(__FILE__) + '/bower_components'
    
        get '/' do
          if logged_in?
            haml :welcome_in, layout: :layout
          else
            haml :log_in, layout: :layout
          end
        end
    
        get '/log_out' do
          session['oauth'] = nil
          session['access_token'] = nil
    
          redirect '/'
        end
    
        get '/log_in' do
          session['oauth'] = Koala::Facebook::OAuth.new(APP_ID, APP_SECRET, "#{request.base_url}/call_back")
          redirect session['oauth'].url_for_oauth_code()
        end
    
        get '/call_back' do
          begin
            session['access_token'] = session['oauth'].get_access_token(params[:code])
          rescue
            redirect '/?error=user_denied'
          end
          redirect '/'
        end
    
        get '/test' do
          if logged_in?
            p graph.get_object("rakeshbs")
            "e"
          else
            redirect '/'
          end
        end
    
        def logged_in?
          !session['access_token'].nil?
        end
    
        def toggle_access
          logged_in? ? '/log_out' : '/log_in'
        end
    
        def graph
          @graph ||= Koala::Facebook::API.new(session['access_token'])
        end
    
        def errored?
          !params["error"].nil?
        end
    
        def user
          p graph.get_connections(:me, :photos) # This is just nil
          @user ||= OpenStruct.new(
            name: graph.get_object("me")["name"], # All I get here is just a hash with the name and an id!
            photo: 'http://semantic-ui.com/images/avatar/small/elliot.jpg'
          )
        end
      end
    end
    

1 个答案:

答案 0 :(得分:2)

您应该添加fields参数。

这样的事情: graph.get_object('me', { fields: 'id,first_name,last_name,gender,birthday,photos,email' })