正如您可能从标题中猜到的那样,我正在尝试使用 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?