错误——omniauth:(facebook)身份验证失败

ERROR -- omniauth: (facebook) Authentication failure

我在使用最新的 Omniauth Facebook gem 时遇到以下错误:

ERROR -- omniauth: (facebook) Authentication failure! invalid_credentials: OAuth2::Error, :

我的凭据是正确的,我似乎可以访问 facebook,但回调错误。

有什么想法吗?

我遇到的问题是我的应用程序使用的是旧版本的 facebook API。 Omniauth-facebook 使用默认的 API 版本,在我的例子中是 2.4,但我的应用程序需要一个更新的版本,因为这就是它在我的 Facebook 开发者控制台中所说的。就我而言,我所要做的就是将 omniauth-facebook gem 更新到 4.0 版。

如果您愿意,可以设置您想使用的 Facebook API 版本,而不是像这样使用默认版本(omniauth-facebook 文档):

use OmniAuth::Builder do
  provider :facebook, ENV['APP_ID'], ENV['APP_SECRET'],
    client_options: {
      site: 'https://graph.facebook.com/v3.0',  # this is the example API version
      authorize_url: "https://www.facebook.com/v3.0/dialog/oauth"
    }
end

您可以前往 Facebook 开发者控制台查看您的应用使用的 API 版本。

您可以在此处阅读有关 omniauth-facebook gem API 的更多信息: http://www.rubydoc.info/gems/omniauth-facebook/4.0.0#API_Version

我遇到了同样的问题,但指定版本对我没有帮助。我最终传递了 token_params: { parse: :json } 类似下面的内容,解决了我的问题:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, Figaro.env.fb_appid, Figaro.env.fb_sec,
           { scope: 'email',  token_params: { parse: :json } }
end

我找到参考了#174 comment

如果您不直接使用 gem 作为中间件,而是在 config/initializers/devise.rb 中配置您的选项(如 the guide in Devise's wiki suggests),您可以通过添加 token_params: { parse: :json } 到您的配置选项。

因此,在 config/initializers/devise.rb:

config.omniauth :facebook, "APP_ID", "APP_SECRET", token_params: { parse: :json }

此问题已在上面链接的 Devise 维基中明确处理(请参阅“如果您看到类似无法从 Facebook 对您进行身份验证,因为“凭据无效”...)

请尽可能详细地说明您的问题,以便更深入地了解问题。这将有助于找出确切的问题和答案。

因为您没有具体说明您的问题。经过多次尝试和研究,我把我的答案放在这里。

我的错误

ERROR -- omniauth: (facebook) Authentication failure! invalid_credentials: OAuth2::Error, {"message"=>"Cannot call API for app 67878******** on behalf of user sa97**********", "type"=>"OAuthException", "code"=>200, "fbtrace_id"=>"8987987*********"}:

如果通过使用 his/her 详细信息注册进行身份验证的 Facebook 用户在他的 Facebook 个人资料中只有手机号码并且 没有电子邮件,我就会遇到上述问题ID 因为我的应用正在验证在创建任何用户对象之前应该存在电子邮件 ID。

因为相同的代码对于在个人资料中具有电子邮件 ID 的用户可以正常工作。

虽然 Facebook 错误应该更具体,这可以节省开发人员调试确切问题的时间。