我正在编写一个Rails应用程序,该应用程序使用omniauth-facebook来针对FB对用户进行身份验证(以及为用户获取FB OAuth访问令牌).然后,应用程序使用Koala使用保存的OAuth令牌对FB Graph API进行各种调用.
每次用户重新进行身份验证时(通常在他们登录我的应用程序时),我都会更新已保存的令牌.即便如此,保存的令牌也会不时到期(或以其他方式变为无效).
在使用考拉时,防止身份验证失败和更新令牌的最佳做法是什么?
是否所有调用都包含在begin/rescue块中,并使用异常处理程序对FB进行重新验证?
是否有某种方式(使用Koala)来利用此处描述的"扩展访问令牌"流程?如果没有,是否有编写自己的代码以从Koala调用中自己提取新令牌的最佳实践?
我Koala
在Ruby on Rails应用程序上使用gem
我在通过Koala使用的数据模型上有以下代码:
@graph = Koala::Facebook::GraphAPI.new(token_secret)
friends = @graph.get_connections("me", "friends")
Run Code Online (Sandbox Code Playgroud)
其中,token_secret
来自于我的一个字段users
的表,保存在登录.
它工作正常但几分钟后我得到:
Koala::Facebook::APIError (OAuthException: Error validating access token: Session has expired at unix time 1327438800. The current unix time is 1327442037.):
Run Code Online (Sandbox Code Playgroud)
我找到了在前面用这些方法更新这个令牌的方法,Facebook JS SDK
但是这个方法我在控制器上调用了朋友列表.
如何更新token_secret
使用考拉?这可能吗?
我正试图让考拉与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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
用户模型有
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
Run Code Online (Sandbox Code Playgroud)
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 …
Run Code Online (Sandbox Code Playgroud) ruby-on-rails facebook-graph-api omniauth ruby-on-rails-3 koala
有人可以帮助我获得total_count的用户朋友吗?
u.facebook.get_connection("me", "friends",api_version:"v2.0")
Run Code Online (Sandbox Code Playgroud)
这返回0因为它返回也使用我的应用程序的朋友.
但是在api 2.0 facebook中,将total_count字段与朋友号码一起给出
{
"data": [
],
"summary": {
"total_count": 455
}
}
Run Code Online (Sandbox Code Playgroud)
我如何通过考拉宝石获得这个?
u.facebook.get_connection("me", "friends/#{summary}",api_version:"v2.0")
Run Code Online (Sandbox Code Playgroud)
这个返回错误.
答案如果有人会搜索这个:
facebook.get_connection("me", "friends",api_version:"v2.0").raw_response["summary"]["total_count"]
Run Code Online (Sandbox Code Playgroud) 有没有办法从Ruby on Rails发布Facebook应用程序邀请,例如通过部署Koala?
一眼看上去是不可能的.除了简单地发布到墙上之外的任何变通方法?
我有一个应用程序,用户可以链接他们的Facebook帐户.他们可以使用他们的电子邮件登录,但他们可以链接他们的Facebook帐户.
在我显示链接的社交网络(Facebook和其他)的视图中,我有这样的事情:
<%= image_tag @facebook.get_facebook_picture %>
Run Code Online (Sandbox Code Playgroud)
这将调用这样的实例方法:
def get_facebook_picture
unless self.token.nil?
facebook_graph = Koala::Facebook::GraphAPI.new(self.token)
fb_picture = facebook_graph.get_picture("me", { :type => "small" })
end
end
Run Code Online (Sandbox Code Playgroud)
这将很有效,除非我存储在我的数据库中的Facebook令牌已过期.所以我在上述控制器中添加了这个异常处理程序:
def facebook_exception_handler exception
if exception.fb_error_type.eql? 'OAuthException'
# Let's get a new auth token... How?
else
logger.debug "Damn it. We don't know what error is coming from FB"
raise exception
end
end
Run Code Online (Sandbox Code Playgroud)
我正确地捕获了异常,但是我没有看到如何更新我在数据库中的访问令牌.请注意,我使用OmniAuth插入了我的访问令牌.所以我的问题是:
鉴于我有,我OAuthException
如何使用Omniauth续订特定用户(UID)的访问令牌?
似乎Facebook在12月5日的新版本给我带来了一些问题.是否有其他人收到此错误?
Koala :: Facebook :: APIError(OAuthException:此授权码已被使用.)
我能够oauth,但是当我发出呼叫时,执行以下操作......我得到了错误.即以下:
@friends = graph.get_object("/me/friends")
Run Code Online (Sandbox Code Playgroud)
这是Facebook更新:
OAuth授权码的新安全限制我们只允许一次授权代码交换访问令牌,并要求在创建后的10分钟内将其交换为访问令牌.这与OAuth 2.0规范一致,从一开始就说"授权代码必须是短期和单次使用".有关更多信息,请查看我们的身份验证文档.
如果有人可以提供帮助,或者甚至更具体地说明Facebook更新的含义,那将非常有帮助.我正在使用Rails考拉宝石.
这似乎在这里报道,但没有答案有帮助.
http://developers.facebook.com/bugs/121266004701942?browse=search_50c113068fae60719135553
根据facebook,截至2014年4月30日,该create_event
方法已不再可用,我认为这意味着无法发布事件?
https://developers.facebook.com/docs/apps/changelog
create_event不再可用.
是否仍然可以使用v1.0?(将于2015年4月30日逐步淘汰).我找不到任何示例,我想代表facebook页面发布活动.这还有可能吗?
https://developers.facebook.com/docs/graph-api/reference/v1.0/page/events
当我尝试它时,我得到折旧警告和冒充使用令牌的页面,但是当我使用我的个人令牌时它也失败了.可能是因为我没有create_event权限(尽管请求它,它不会显示在facebook令牌调试器中)
Deprecation warning: The REST API is now deprecated; please use the equivalent Graph API methods instead. See http://developers.facebook.com/blog/post/616/.
=> {"error_code"=>190,
"error_msg"=>"Impersonated access tokens can only be used with the Graph API",
Run Code Online (Sandbox Code Playgroud)
权限:
[{"permission"=>"installed", "status"=>"granted"},
{"permission"=>"public_profile", "status"=>"granted"},
{"permission"=>"manage_pages", "status"=>"granted"},
{"permission"=>"publish_actions", "status"=>"granted"}]
Run Code Online (Sandbox Code Playgroud) 我的情况和我所拥有的:
现在的情况:
我在一个网站上创建页面,我的代码应从我的Facebook帐户中提取最后的帖子并在该页面上显示.
我已经做了什么:
然后我在我的模型中创建了该代码:
oauth = Koala::Facebook::OAuth.new(APP_ID, APP_SECRET)
new_access_info = oauth.exchange_access_token_info self.get_token <- here i pull token from DB
new_access_token = new_access_info["access_token"]
new_access_expires_at = DateTime.now + new_access_info["expires"].to_i.seconds
self.update_all(:token => new_access_token) ***<- saving token in db***
self.update_all(:exp => new_access_expires_at) ***<- saving expiration of token in db***
@facebook ||= Koala::Facebook::API.new(self.get_token)
Run Code Online (Sandbox Code Playgroud)所以,我第一次将我的短期令牌直接放在db中,所以我的代码可以从那里拉出来,然后,当我重新加载页面时,我得到了新的,长期令牌(它有截止日期12/01/2015) .
但!当我每次重新加载页面时,我会获得新令牌,但是有SAME到期日期(FB的调试器说我一样,当我从我的页面复制令牌并将其粘贴到调试器中时).
我甚至试图在不同的日子里做这件事,因为我读到"某个地方"令牌翻新期是每天一次,但是:
令牌总是不同,但有效期始终相同.
我需要的:
更新该令牌或编写代码,以便自动更新令牌而无需我的操作,因为没有登录窗口或类似的东西.它应该只在服务器端工作.
有什么想法吗?已经阅读了很多信息和类似的问题,但大多数问题都与用户交互有关,比如以适当的形式登录等等,所以 - 没有运气:/
我正在使用Ruby on Rails和Koala gem构建一个facebook应用程序来构建我自己的登录流程.
https://github.com/arsduo/koala https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/
我的问题非常简单.
假设以下情况:
- 尝试连接到我的应用程序的用户有多个他们管理的Facebook页面.我希望他们能够只选择他们希望我管理的特定页面,同时拒绝访问其余页面.
原因是很多将使用我的应用程序的管理员管理大量页面.当我只需要一小部分页面的权限时,我无法想象他们可以获得所有页面的权限.
我正在使用Ruby on Rails