ruby-on-rails - google - rails devise omniauth facebook
Omniauth-Facebook sigue informando invalid_credentials (7)
Estoy tratando de implementar omniauth-facebook como se describe en Railscast # 360 y me he topado con un obstáculo. Cuando hago clic en el enlace de inicio de sesión, aparece la ventana emergente deseada solicitando que ingrese mis credenciales de Facebook, pero cuando envío, aparece el error OmniAuth :: Strategies :: OAuth2 :: CallbackError. En los registros de Apache, esto se imprime: (Facebook) Error de autenticación. invalid_credentials: OmniAuth :: Strategies :: OAuth2 :: CallbackError, OmniAuth :: Strategies :: OAuth2 :: CallbackError
aquí está el código relevante:
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>
¿Me estoy perdiendo algo simple? He estado buscando una solución para los últimos días.
En su omniauth.rb agregue el código:
OmniAuth.config.on_failure = Proc.new do |env| new_path = "/auth/failure"
[302, {''Location'' => new_path, ''Content-Type''=> ''text/html''}, []]
end
Me he dado cuenta de que omniauth-oauth2> 1.0.3 también causará un problema, desinstalando una versión más alta y manteniendo omniauth-oauth2 1.0.3 resuelto el problema.
Para cualquiera que sea descuidado como yo,
Remember to switch you app out of Sandbox mode
en developers.facebook antes de implementar!
El modo de espacio aislado desencadenará el error de csrf para todos menos para la cuenta del desarrollador.
Parece que omniauth-facebook v1.4.1 introdujo un problema con CSRF. Una solución temporal es simplemente retroceder a v1.4.0. En su Gemfile, cambie la línea omniauth-facebook a:
gem ''omniauth-facebook'', ''1.4.0''
He informado el problema: https://github.com/mkdynamic/omniauth-facebook/issues/73
Tuve un problema similar en el que funcionaba para 1 usuario pero obtuve el error de autenticación para el segundo usuario.
Al deshabilitar el modo Sandbox (Aplicaciones> Configuración> Avanzado) parece que lo ha solucionado.
Yo también tengo esto
Quite la secuencia de comandos JS en su application.html.erb
(pero mantenga el div fb-root
) funcionará. De todos modos, la pantalla de inicio de sesión de FB ya no se mostrará en una ventana emergente, sino que se le redirigirá al inicio de sesión de FB y luego a su sitio.
es posible que desee anular OmniauthCallbacksController y agregar esto al registro:
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
después de que he agregado el mío, encontré el problema de "ip no válida ..."