我正试图让考拉与Omniauth合作。用户模型使用Omniauth登录Facebook,我想使用Koala作为客户端来提取正在使用该应用程序的用户的朋友列表。我似乎没有正确保存令牌:
控制器
@friends = Array.new
if current_user.token
graph = Koala::Facebook::GraphAPI.new(current_user.token)
@profile_image = graph.get_picture("me")
@fbprofile = graph.get_object("me")
@friends = graph.get_connections("me", "friends")
end
DB Schema
create_table "users", :force => true do |t|
t.string "provider"
t.string "uid"
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
t.string "token"
end
用户模型
def self.create_with_omniauth(auth)
create! do |user|
user.provider = auth["provider"]
user.uid = auth["uid"]
user.name = auth["user_info"]["name"]
end
end
Koala.rb初始化程序:
module Facebook
CONFIG = YAML.load_file(Rails.root.join("config/facebook.yml"))[Rails.env]
APP_ID = CONFIG['app_id']
SECRET = CONFIG['secret_key']
end
Koala::Facebook::OAuth.class_eval do
def initialize_with_default_settings(*args)
case args.size
when 0, 1
raise "application id and/or secret are not specified in the config" unless Facebook::APP_ID && Facebook::SECRET
initialize_without_default_settings(Facebook::APP_ID.to_s, Facebook::SECRET.to_s, args.first)
when 2, 3
initialize_without_default_settings(*args)
end
end
alias_method_chain :initialize, :default_settings
end
会话控制器有:
def create
auth = request.env["omniauth.auth"]
user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth)
session[:user_id] = user.id
session['fb_auth'] = request.env['omniauth.auth']
session['fb_access_token'] = omniauth['credentials']['token']
session['fb_error'] = nil
redirect_to root_url
end
答案 0 :(得分:12)
您已经知道的问题是fb_access_token仅在当前会话中可用且不可用于Koala。
您的用户模型是否有一个存储“令牌”的列?如果没有,请确保您在用户模型中具有该列。当您在用户模型中具有该列时,您将需要在创建用户时在其中存储内容(User类中的create_with_omniauth方法)。在从facebook成功授权后,您会发现令牌字段填充了facebook oauth令牌。如果已填充,那么您的考拉代码应该可以使用。在这种情况下,不需要在会话中存储facebook凭证。
但是,如果您没有从Facebook进行离线访问(这意味着访问仅在短时间内提供,那么在会话中存储facebook凭据是有道理的。在这种情况下,您不应该使用“current_user.token”但是会话[“fb_auth_token”]而不是考拉。
希望这有帮助!
因此,如果您想要离线访问(Facebook授权的长期存储),请将您的型号代码更改为存储fb_auth_token,如下所示
# User model
def self.create_with_omniauth(auth)
create! do |user|
user.provider = auth["provider"]
user.uid = auth["uid"]
user.name = auth["user_info"]["name"]
user.token = auth['credentials']['token']
end
end
# SessionsController
def create
auth = request.env["omniauth.auth"]
user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth)
# Note i've also passed the omniauth object
session[:user_id] = user.id
session['fb_auth'] = auth
session['fb_access_token'] = auth['credentials']['token']
session['fb_error'] = nil
redirect_to root_url
end
如果您有短期访问权限,请将“其他”控制器更改为使用会话
# The other controller
def whateverthissactionis
@friends = Array.new
if session["fb_access_token"].present?
graph = Koala::Facebook::GraphAPI.new(session["fb_access_token"]) # Note that i'm using session here
@profile_image = graph.get_picture("me")
@fbprofile = graph.get_object("me")
@friends = graph.get_connections("me", "friends")
end
end
答案 1 :(得分:0)
当你可以测试时,避免写作:
https://github.com/holden/devise-omniauth-example/blob/master/config/initializers/devise.rb
我已经将该应用程序用作成功的基础。
我已经修复了一些问题,但是还没有在github上提交。但那些非常小。我认为示例应用程序有效。
您的问题可能不是考拉,而是令牌未保存,因此您无法查询任何内容甚至连接到Facebook。
答案 2 :(得分:0)
您的问题似乎是您将错误的内容传递给考拉:
if @token = current_user.token
@graph = Koala::Facebook::GraphAPI.new(oauth_callback_url)
@friends = @graph.get_connections("me", "friends")
end
尝试将其更改为以下内容:
@friends = Array.new # I think it returns a straight array, might be wrong.
if current_user.token
graph = Koala::Facebook::GraphAPI.new(current_user.token)
@friends = graph.get_connections("me", "friends")
end