2

我已经按照Railscast 360为我的 Rails 应用程序设置了 Omniauth-Facebook 身份验证。身份验证效果很好,但我让自己发疯,试图通过范围请求以获得额外的权限。我知道它们是可用的,因为我可以手动将范围请求输入 url。我已经尝试了一切并用尽了所有谷歌搜索。

正如 Railscast 评论中所建议的那样,我已将 Omniauth-Facebook gem 降级到 1.4.0,据我了解,这意味着范围不能作为 Omniauth 初始化程序的哈希传递,而是通过 javascript 传递。两者都不适合我,但与我根据 Railscast 运行咖啡脚本的评论不同,我已经尝试了各种位置的范围,但要么得到错误或不完整的结果......即只有电子邮件,没有 user_events 等。

我意识到这里没有代码,但它与 railscast 完全一样。

也遵循相同 Railscast 的任何人都可以就使用 1.4.1 解决问题提供任何建议,以便我可以从初始化程序传递范围哈希,或者在运行 1.4.0 时如何正确传递它。

提前致谢!

更新:我有点到了某个地方!但这并不完全正确。任何指针将不胜感激。

在我的 Omniauth 初始化程序中,我有:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, 'app_id', 'secret_id', {:scope => 'user_birthday,user_events,email'}
end

(插入真实身份!)

然后,我似乎可以通过将单词范围放入咖啡脚本中的 FB.Init 来提出正确的请求:

jQuery ->
  $('body').prepend('<div id="fb-root"></div>')

  $.ajax
    url: "#{window.location.protocol}//connect.facebook.net/en_US/all.js"
    dataType: 'script'
    cache: true

window.fbAsyncInit = ->
  FB.init(appId: 'app_id', cookie: true, scope)

  $('#sign_in').click (e) ->
    e.preventDefault()
    FB.login (response) ->
       window.location = "/auth/facebook/callback"  if response.authResponse    

  $('#sign_out').click (e) ->
    FB.getLoginStatus (response) ->
      FB.logout() if response.authResponse
    true

(再次在上面插入了真正的 appid)

但是,这会停止弹出窗口的工作,所以我很确定我错误地放置了范围。我看到的其他示例将它放在 FB.login 中,但我尝试放置在那里的尝试要么抛出错误,要么根本不起作用。

帮助!:)

4

1 回答 1

8

设法解决了这个问题。是咖啡脚本把我扔了。http://coffeescript.org/上的 try coffeescript 工具非常有帮助。

范围的正确放置如下:

  $('#sign_in').click (e) ->
    e.preventDefault()
    FB.login ((response) ->
      window.location = '/auth/facebook/callback' if response.authResponse), scope: "email,user_events,user_location,user_birthday"

希望这对其他人有所帮助。

于 2012-09-30T17:59:26.513 回答