28

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

这是相关代码:

全域认证.rb

OmniAuth.config.logger = Rails.logger

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

session_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

应用程序.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>

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

4

7 回答 7

68

似乎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

于 2012-07-23T21:38:43.200 回答
6

我有一个类似的问题,它适用于 1 个用户,但收到第 2 个用户的身份验证错误。

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

于 2012-07-23T19:16:49.837 回答
1

在您的 omniauth.rb 添加代码:

OmniAuth.config.on_failure = Proc.new do |env| new_path = "/auth/failure"
 [302, {'Location' => new_path, 'Content-Type'=> 'text/html'}, []]
end
于 2012-07-27T21:12:15.160 回答
1

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

于 2013-03-03T20:21:54.760 回答
0

我也有这个。

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

于 2012-07-23T14:25:57.877 回答
0

对于像我这样粗心的人,

Remember to switch you app out of Sandbox mode部署之前在developers.facebook 上!

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

于 2012-10-25T03:01:41.053 回答
0

您可能想要覆盖 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...”问题,

于 2014-08-14T14:19:29.080 回答