无法通过Facebook验证

时间:2012-03-16 02:03:08

标签: ruby-on-rails facebook authentication omniauth

我正在关注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登录信息(即使它最终无法正常工作,因为我们还没有设置回调网址)但是,当我走的时候到那个网址,我收到了这个错误

{
   "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

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

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

4 个答案:

答案 0 :(得分:7)

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

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

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

如果您正在使用设计,请在您的设计文件中配置您的连接;如果您使用简单的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澄清了这个问题的解决方案。

最后,要在本地测试您的登录信息,您只需将您的网站网址定义为http://localhost:3000/即可。这就是全部。您必须定义画布URL。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

首先,确保您在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/ 画布网址

然后,您应该只需将用户重定向到http://localhost:3000/auth/facebook即可向他们显示身份验证对话框。