使用 OmniAuth & Rails 获取用户的当前 Facebook 状态



正如您可能已经从标题中猜到的那样,我正在尝试使用OmniAuth来获取用户当前的Facebook状态(用于新的选择加入功能)。我已经将必要的范围选项传递到全能身份验证初始值设定项内的提供程序方法中。我知道这是一口,对不起。这段代码应该有帮助:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, ENV['FACEBOOK_ID'], ENV['FACEBOOK_SECRET'], { scope: 'user_status' }
end

我知道这部分有效,因为在OAuth对话期间,Facebook会提示用户允许访问他们的状态消息。所以,问题是我希望他们的状态在身份验证哈希中返回,其余的用户信息,但它不存在。

def callback
  raise request.env['omniauth.auth'].to_yaml
end

是的,这过于简单化了,但我认为你不在乎我的before_filters等。

我已经用谷歌搜索了大约 2 个小时,我找到的所有示例都是人为的。涵盖范围的内容仅提及如何请求权限,但没有提到如何实际获取数据。

在SO上有一个类似的未回答的问题,但它太老了,我认为复活它不是一个好主意。

我将不胜感激任何帮助。谢谢!


7月3日更新:

感谢您的帮助!我已经接受了您的建议,并使用身份验证哈希中的令牌来请求用户的当前状态,如下所示:

FbGraph::User.me(@auth[:credentials][:token]).posts.first.message

对于未来的读者:请务必注意,令牌将在大约 2 个月后过期,并且每次用户更改密码时都会过期。你可能希望在用户的令牌即将过期时通知用户。从我在FB文档中收集到的信息来看,到期日期以Unix时间戳的形式表示。您可以将其转换为更有用的内容,例如Ruby DateTime,如下所示:

expires_at = Time.at(@auth[:credentials][:expires_at]).to_datetime

然后,可以将令牌保存在模型中,并在其上调用 past?,以确保应用不会尝试使用无效令牌。

do_something unless expires_at.past?

当您设置user_status权限(并且用户批准)时,Facebook 会授予您的应用程序读取该用户状态消息的访问权限。身份验证过程中不会返回任何用户状态消息,您必须发出单独的调用来检索用户的状态更新。

在您的应用获得权限后,您可以使用 Gem fb_graph 向 Facebook 发出后续请求。下面是如何将其与 OmniAuth 集成的示例:

user = FbGraph::User.new('me', :access_token => session[:omniauth]["credentials"]["token"])
user.fetch

您可以使用的其他宝石是考拉和oauth2。下面是使用 oauth2 和 Facebook 的示例。

据我所知,状态(stati)不会作为身份验证哈希的一部分返回。您必须在获得令牌后请求此内容。例如(使用考拉宝石):

api = Koala::Facebook::API.new(auth.credentials.token)
api.get_connections('me', 'statuses').first

您可以使用图形浏览器进行检查:

http://developers.facebook.com/tools/explorer/?method=GET&path=me%2Fstatuses

最新更新