Comment sauver OmniAuth:: Strategies:: OAuth2:: CallbackError?
Je construis une application Rails avec Omniauth pour la connexion service.To authentifier Google que j'utilise OmniAuth Google OAuth2 Strategy .
Lorsque l'utilisateur clique sur le bouton "Autoriser l'accès", Tout fonctionne correctement.Mais lorsque l'utilisateur clique sur le bouton "Non merci", l'erreur ci-dessous est déclenchée.
OmniAuth::Strategies::OAuth2::CallbackError
J'ai essayé d'ajouter le code de sauvetage ci-dessous dans le contrôleur d'application.
class ApplicationController < ActionController::Base
rescue_from OmniAuth::Strategies::OAuth2::CallbackError, :with =>
:omniauth_callback_error_handler
protected
def omniauth_callback_error_handler
redirect_to init_sign_in_users_path
end
end
Mais pas de chance.
Une idée?
Merci :)
4 réponses
Cela se produit parce que l'authentification se produit dans un middleware de sorte que votre contrôleur n'y est pas impliqué. C'est où l'exception est soulevée et le code est ce
Je pense que vous pouvez gérer ce genre d'erreur en définissant un rappel dans Omniauth initializer avec ce type de code
Omniauth.config do |config|
config.on_failure do
# your handling code invoked in the context of a rack app
end
end
Sinon il y a un commit d'il y a trois mois qui introduit ce comportement
def redirect_to_failure
message_key = env['omniauth.error.type']
new_path = "#{env['SCRIPT_NAME']}#{OmniAuth.config.path_prefix}/failure?message=#{message_key}"
Rack::Response.new(["302 Moved"], 302, 'Location' => new_path).finish
end
Qui indique que sur les erreurs, votre utilisateur est redirigé à /auth/failure
avec un message d'erreur, vous devriez donc pouvoir définir un itinéraire pour ce chemin et le gérer dans votre application. Gardez à l'esprit que cela n'arrivera pas en mode développement vous devez donc l'essayer dans d'autres envs. Si cela ne se produit pas en production, essayez de mettre à niveau votre gem omniauth vers la version 1.1.0
Vous pouvez définir le processus on_failure dans l'initialiseur omniauth d'une manière encore plus propre:
OmniAuth.config.on_failure = UsersController.action(:oauth_failure)
J'ai résolu ce problème avec la première suggestion de Fabio.
OmniAuth.config.on_failure = Proc.new do |env|
UsersController.action(:omniauth_failure).call(env)
#this will invoke the omniauth_failure action in UsersController.
end
Dans mon UsersController
class UsersController < ActionController::Base
def omniauth_failure
redirect_to init_sign_in_users_path
#redirect wherever you want.
end
end
Il y a une configuration à utiliser /auth/failure
au lieu de générer une erreur.
J'utilise OmniAuth 1.2.2 et quand je vérifie le FailureEndpoint j'ai trouvé que le code est comme this :
def call
raise_out! if OmniAuth.config.failure_raise_out_environments.include?(ENV['RACK_ENV'].to_s)
redirect_to_failure
end
Et le failure_raise_out_environments
est définie ici:
def self.defaults
@defaults ||= {
# other configurations
:failure_raise_out_environments => ['development']
}
end
L'environnement peut être configuré pour que la solution soit facile. J'utilise Rails donc je mets ci-dessous du code dans un fichier d'initialisation:
OmniAuth.configure do |config|
# Always use /auth/failure in any environment
config.failure_raise_out_environments = []
end