Omniauth-facebook ведет отчетность invalid_credentials

Я пытаюсь реализовать omniauth-facebook, как описано в Railscast # 360, и столкнулся с довольно дорожным блоком. Когда я нажимаю на ссылку signin, я получаю нужное всплывающее окно с просьбой ввести мои учетные данные в facebook, но когда я отправляю сообщение, я получаю сообщение OmniAuth:: Strategies:: OAuth2:: CallbackError. В журналах apache это печатается: (facebook) Ошибка аутентификации! invalid_credentials: OmniAuth:: Стратегии:: OAuth2:: CallbackError, OmniAuth:: Стратегии:: 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>

Я пропустил что-то простое? Я искал решение в течение последних нескольких дней.

Ответ 1

Кажется, что omniauth-facebook v1.4.1 представляет проблему с CSRF. Временное исправление - просто вернуться к версии 1.4. В своем Gemfile измените строку omniauth-facebook на:

gem 'omniauth-facebook', '1.4.0'

Я сообщил об ошибке: https://github.com/mkdynamic/omniauth-facebook/issues/73

Ответ 2

У меня была аналогичная проблема, когда она работала для 1 пользователя, но получала ошибку аутентификации для второго пользователя.

Отключение режима Песочницы (Приложения > Настройки > Дополнительно), похоже, исправил его.

Ответ 3

В вашем omniauth.rb добавить код:

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

Ответ 4

Я заметил, что omniauth-oauth2 > 1.0.3 также вызовет проблему, удалив более высокую версию и сохранит omniauth-oauth2 1.0.3, решив проблему.

Ответ 5

У меня тоже есть.

Удалите JS script в application.html.erb (но держите fb-root div). В любом случае, окно входа в FB больше не будет отображаться во всплывающем окне, вы будете перенаправлены на вход FB, а затем обратно на свой сайт.

Ответ 6

Для тех, кто небрежен, как я,

Remember to switch you app out of Sandbox mode у разработчиков .facebook перед развертыванием!

Режим Sandbox вызывает ошибку csrf для всех, кроме учетной записи разработчика.

Ответ 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

после того, как ive добавил мой, я обнаружил ошибку "invalid ip...",