在 Sinatra 中使用 Ruby Koala gem 的网站的 Facebook Graph API
Facebook Graph API for websites using Ruby Koala gem in Sinatra
我想为网络应用程序实现 Facebook 登录。我只需要用户的基本 public 信息即可创建帐户。
这是我所做的:
- 创建了一个几乎没有自定义权限的基本 Facebook 应用程序。
- 使用
Koala
中的 APP_ID
和 APP_SECRET
得到 access_token
。
- 一切正常,我可以login/logout。
- 只是当我这样做时我能得到的唯一信息:
graph.get_object('me')
是登录的用户名和一个 id
(它看起来不像默认的 Facebook id) .
- 我很惊讶新 API 中是否发生了某些变化,我使用图浏览器中的
access_token
在控制台中测试了 gem(默认情况下启用所有权限)。我使用相同的方法调用获取所有数据。
- 当我查看注册时所有应用程序获得的内容时;我看到应用程序可以访问用户的基本信息、个人资料照片和其他 public 数据。
知道为什么会这样吗?看来我遗漏了一些明显的东西。该代码在 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
您应该添加 fields
参数。
像这样:
graph.get_object('me', { fields: 'id,first_name,last_name,gender,birthday,photos,email' })
我想为网络应用程序实现 Facebook 登录。我只需要用户的基本 public 信息即可创建帐户。
这是我所做的:
- 创建了一个几乎没有自定义权限的基本 Facebook 应用程序。
- 使用
Koala
中的APP_ID
和APP_SECRET
得到access_token
。 - 一切正常,我可以login/logout。
- 只是当我这样做时我能得到的唯一信息:
graph.get_object('me')
是登录的用户名和一个id
(它看起来不像默认的 Facebook id) . - 我很惊讶新 API 中是否发生了某些变化,我使用图浏览器中的
access_token
在控制台中测试了 gem(默认情况下启用所有权限)。我使用相同的方法调用获取所有数据。 - 当我查看注册时所有应用程序获得的内容时;我看到应用程序可以访问用户的基本信息、个人资料照片和其他 public 数据。
知道为什么会这样吗?看来我遗漏了一些明显的东西。该代码在 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
您应该添加 fields
参数。
像这样:
graph.get_object('me', { fields: 'id,first_name,last_name,gender,birthday,photos,email' })