【问题标题】:Omniauth-facebook keeps reporting invalid_credentialsOmniauth-facebook 不断报告 invalid_credentials
【发布时间】:2012-07-20 18:42:51
【问题描述】:

我正在尝试按照 Railscast #360 中的描述实现omniauth-facebook,但遇到了很大的障碍。当我单击登录链接时,我会收到所需的弹出窗口,要求我输入我的 Facebook 凭据,但是当我提交时,我收到 OmniAuth::Strategies::OAuth2::CallbackError 错误。在 apache 日志中,会打印以下内容:(facebook) Authentication failure! invalid_credentials: OmniAuth::Strategies::OAuth2::CallbackError, OmniAuth::Strategies::OAuth2::CallbackError

这里是相关代码:

omniauth.rb

OmniAuth.config.logger = Rails.logger

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_SECRET']
end

sessions_controller.rb

class SessionsController < ApplicationController
  def create
    user = User.from_omniauth(env["omniauth.auth"])
    session[:user_id] = user.id
    redirect_to root_url
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url
  end
end

application.html.erb

<div id="fb-root"></div>
<script>        
window.fbAsyncInit = function() {
    FB.init({
        appId      : '(**my app id**)', // App ID
        status     : true, // check login status
        cookie     : true // enable cookies to allow the server to access the session
    });

    $('#sign_in').click(function(e) {
        e.preventDefault();
        return FB.login(function(response) {
            if (response.authResponse) {
                return window.location = '/auth/facebook/callback';
            }
        });
    });

    return $('#sign_out').click(function(e) {
        FB.getLoginStatus(function(response) {
            if (response.authResponse) {
                return FB.logout();
            }
        });
        return true;
    });
};
 </script>

我错过了一些简单的东西吗?过去几天我一直在寻找解决方案。

【问题讨论】:

    标签: ruby-on-rails facebook omniauth


    【解决方案1】:

    我也有这个。

    删除 application.html.erb 中的 JS 脚本(但保留 fb-root div)将起作用。无论如何,FB 登录屏幕将不再显示在弹出窗口中,您将被重定向到 FB 登录,然后返回您的站点。

    【讨论】:

    • 我在脚本中使用它的原因是我可以有弹出窗口。我不希望我的用户重定向离开我的网站。
    【解决方案2】:

    我有一个类似的问题,它为 1 个用户工作,但为第 2 个用户收到了 Authenticating 错误。

    禁用沙盒模式(应用程序>设置>高级)似乎已修复它。

    【讨论】:

    • 设置需要几分钟才能传播。您是否尝试过从用户的个人资料中删除该应用并尝试登录?
    • 我在你的和我的之间看到的唯一代码区别是我没有状态:是的,在我的 FB.init 中
    • 为我工作!谢谢@PragneshVaghela
    【解决方案3】:

    omniauth-facebook v1.4.1 似乎引入了 CSRF 问题。临时修复是回滚到 v1.4.0。在您的 Gemfile 中,将 omniauth-facebook 行更改为:

    gem 'omniauth-facebook', '1.4.0'
    

    我已报告该问题:https://github.com/mkdynamic/omniauth-facebook/issues/73

    【讨论】:

    • 汤姆,你已经结束了沮丧的日子。有一些清理工作要做,但这个简单的解决方案解决了这个问题。非常感谢您对此进行调查!
    • 太棒了!上帝爱你——还有 stackoverflow。
    • 请注意,这不是真正的解决方案。要求状态参数是(当前)通过 oauth 防止 CSRF 的唯一解决方案。因此,在某些时候,这个问题必须得到解决。不幸的是,并非所有提供者都返回状态参数,在某些情况下,它甚至被滥用于内部功能。所以这会很有趣。
    • 你拯救了我的一天。 Ryan Bates 必须在 railscast 更新他的帖子
    • 有一个 'provider_ignores_state' 选项,因此您不必降级:github.com/intridea/omniauth-oauth2/issues/32
    【解决方案4】:

    在你的 omniauth.rb 添加代码:

    OmniAuth.config.on_failure = Proc.new do |env| new_path = "/auth/failure"
     [302, {'Location' => new_path, 'Content-Type'=> 'text/html'}, []]
    end
    

    【讨论】:

    • 看起来如果检测到 CSRF,这只会将您发送到错误页面,并不能真正解决问题。
    【解决方案5】:

    对于像我这样粗心的人,

    在你部署之前在developers.facebookRemember to switch you app out of Sandbox mode

    沙盒模式会触发除开发者账户以外的所有人的 csrf 错误。

    【讨论】:

      【解决方案6】:

      我注意到omniauth-oauth2 > 1.0.3也会导致问题,卸载更高版本并保持omniauth-oauth2 1.0.3解决了问题..

      【讨论】:

      • 这解决了我的问题,不知何故,我在将omniauth-facebook 降级到1.4.0 后获得了最新版本的omniauth-oauth2,感谢您的提示!
      • 很高兴知道它有帮助:)
      【解决方案7】:

      您可能想要覆盖 OmniauthCallbacksController,并将其添加到日志记录中:

      class OmniauthCallbacksController < Devise::OmniauthCallbacksController
        def failure_message
          exception = env["omniauth.error"]
          #add login here:
          Rails.logger.info "exception: #{exception.inspect}"
          error   = exception.error_reason if exception.respond_to?(:error_reason)
          error ||= exception.error        if exception.respond_to?(:error)
          error ||= env["omniauth.error.type"].to_s
          error.to_s.humanize if error
        end
      
        #other code ...
      end
      

      在我添加我的之后,我发现“无效 ip...”问题,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多