0

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

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

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

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

是的,这过于简单了,但我认为您并不关心我的 before_filters 等。

我已经用谷歌搜索了大约 2 小时,我发现的所有示例都是人为设计的。涵盖范围的只提到如何请求权限,而不是如何实际获取数据。

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

我会很感激任何帮助。谢谢!


7月3日更新:

谢谢你的帮助!我听取了您的建议,并使用来自 auth 哈希的令牌来请求用户的当前状态,如下所示:

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

对于未来的读者:重要的是要注意令牌在大约 2 个月后过期,并且每次用户更改密码时。您可能希望在用户的令牌即将到期时通知他们。根据我在 FB 文档中收集到的信息,到期日期以Unix Timestamp的形式表示。您可以将其转换为更有用的东西,例如像这样的Ruby DateTime

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

然后,您可以将令牌保存在模型中并调用过去吗?以确保您的应用不会尝试使用无效令牌。

do_something unless expires_at.past?
4

2 回答 2

2

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

在您的应用获得许可后,您可以使用fb_graph 之类的 gem向 Facebook 发出后续请求。这是一个如何将其与 OmniAuth 集成的示例:

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

您可以使用的其他宝石是koalaoauth2这是使用 oauth2 w/Facebook 的示例

于 2012-07-02T01:58:44.350 回答
1

据我所知,状态(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

于 2012-06-29T22:39:43.293 回答