【问题标题】:can't authenticate with Facebook无法通过 Facebook 进行身份验证
【发布时间】:2012-04-01 14:49:44
【问题描述】:

我按照 Ryan Bate 的说明使用 Omniauth 设置第三方身份验证,但我尝试使用 Facebook 而不是 Twitter,他在 RailsCast 235 中设置。

安装omniauth-facebook gem,并设置初始化程序后

Rails.application.config.middleware.use OmniAuth::Builder do
    provider :facebook, 'APP_ID', 'APP_SECRET'

end

我应该能够访问 localhost:3000/auth/facebook 并看到 Facebook 登录信息(即使它最终不会工作,因为我们还没有设置回调 url)但是,当我去到那个网址,我得到这个错误

{
   "error": {
      "message": "Error validating application.",
      "type": "OAuthException",
      "code": 101
   }
}

并且网址实际上更改为

https://graph.facebook.com/oauth/authorize?response_type=code&client_id=APP_ID&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fauth%2Ffacebook%2Fcallback&scope=email%2Coffline_access

在我的应用程序上,我设置了 Devise 并按照 Devise wiki 上的说明集成 Facebook 授权 https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

谁能告诉我可能是什么问题?

对错误消息进行谷歌搜索发现,最近几周有不少人遇到过这个问题,但找不到任何有解决方案的人

【问题讨论】:

  • 不加评论就投反对票?幼稚的
  • +1 抵消投票,对我来说似乎是合法的。

标签: ruby-on-rails facebook authentication omniauth


【解决方案1】:

首先,确保您在routes.rb 中有以下内容:

# Auth callback routes
match '/auth/:provider/callback' => 'sessions#create' # This route is hit when a user gives the app permissions (the auth hash will be in request.env['omniauth.auth'])
match '/auth/failure' => 'sessions#failure' # This route is hit when a user doesn't give the app permissions

其次,确保您在config/initializers/omniauth.rb 中有以下内容:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, 'APP_ID', 'APP_SECRET', :scope => 'email', :display => 'page'
end

第三,确保您在 Facebook 应用设置 (https://developers.facebook.com/apps/) 中将 http://localhost:3000/ 设置为 Canvas URL

然后您应该能够简单地将您的用户重定向到http://localhost:3000/auth/facebook 以向他们显示身份验证对话框。

【讨论】:

  • 那我不确定。我将omniauth-facebook gem 用于我的应用程序,它的工作原理与宣传的一样。搜索后,似乎唯一可能的情况是您的APP_IDAPP_SECRET 是错误的。仔细检查这些值。
  • 你在 github 上有一个公共项目吗?
  • 不,这是一个私人仓库。对不起。
  • 没问题。我应该去的是 localhost:3000/auth/facebook/ 吗?
  • 是的。我已经更新了答案以包含我的路由和初始化代码。如果他们不适合你,我不确定。您的 app_idapp_secret 有误,您的应用程序处于沙盒模式,或者需要更改一些模糊的 Facebook 字段。
【解决方案2】:

过去,我在 Facebook 应用程序中使用 localhost 时遇到了问题。我最终做的是在我的计算机上的主机文件中创建一个条目,将 fbdev.com 指向 localhost,并在 facebook 的应用程序设置中使用“fbdev.com”代替 localhost。

【讨论】:

    【解决方案3】:

    我搜索了 101,偶然发现了this page。如您所见,该错误代表 Invalid API key,因此我认为问题出在您定义密钥的位置。

    您应该在单独的文件中设置您的密钥和秘密(为了清晰和安全),但请注意 Rails 以 字母顺序 顺序加载文件,因此定义这些常量的文件应该有一个名称配置 oauth 连接的文件之前。就我而言,我创建了一个名为constants.rb 的文件,它位于devise.rb 之前。此外,请确保将此文件远离源代码管理。您不希望其他人拥有您的密钥和秘密。

    # config/initializers/constants.rb
    FACEBOOK_KEY = 'string'
    FACEBOOK_SECRET = 'string'
    

    如果您使用的是 devise,则在您的 devise 文件中配置您的连接;如果您使用的是简单的omniauth,请在您的omniauth 文件中配置您的连接:

    # config/initializers/devise.rb|omniauth.rb
    require 'omniauth-facebook'
    config.omniauth :facebook, FACEBOOK_KEY, FACEBOOK_SECRET
    

    现在,有一种更好的方法可以使用 ENV 变量来执行此操作。我推荐Figaro gem,因为它确实简化了配置应用程序。

    如果您想将 facebook 对话框页面显示为弹出窗口,您需要使用

    config.omniauth :facebook, FACEBOOK_KEY, FACEBOOK_SECRET, :display => 'popup'
    

    然后在后面跟着this question

    而且,如果您使用的是 Windows,则需要一个证书,以便 SSL 连接不会失败。 Arcolye here 澄清了这个问题的解决方案。

    最后,要在本地测试您的登录,您只需将站点 URL 定义为 http://localhost:3000/。这就是全部。您确实不必定义您的画布 URL。

    【讨论】:

    • 奇怪的是,我的解决方案出现了同样的错误,但是当我将 Facebook_key 和 facebook_secret 的身份验证号码直接移动到 config/initializers/devise.rb 中时(即没有使用常量文件中的常量) 然后它工作了......
    • 您使用的是 ENV 变量吗?
    • 在你回答之前,我在终端中使用了环境变量(我还在 heroku 上测试了环境变量但没有成功)。然后在您回复后,我按照您的建议将实际密钥放入常量文件中。它没有用,但是当我将密钥放入 devise.rb 时它起作用了......我希望今晚晚些时候回去进行更多调查,但我认为这就是发生的事情。至少我们已经接近解决方案了:)
    • @Ashitaka 在你的回答中最好的建议是按字母顺序加载文件的轨道,你刚刚挽救了一些严重的心痛:) 谢谢
    【解决方案4】:

    我遇到了同样的错误,但我在添加我的 APP_ID 和 APP_SECRET 后忘记重新启动服务器:-P 也许这会有所帮助?

    【讨论】:

      猜你喜欢
      • 2018-12-28
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      相关资源
      最近更新 更多