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 :)

38
demandé sur Soundar Rathinasamy 2012-05-24 16:06:40

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

32
répondu Fabio 2012-05-24 12:43:59

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)
62
répondu Peter P. 2012-11-26 03:45:02

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
16
répondu Soundar Rathinasamy 2014-05-28 02:45:04

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
0
répondu darkbaby123 2015-06-15 07:43:12