0

Je joue avec la gemme omniauth-facebook pour se connecter à une session de conception grâce à un compte facebook. Lorsque je clique sur le lien "Se connecter avec Facebook", tout se passe bien: un nouveau compte est créé, je suis connecté et je rebondis sur la page d'accueil avec un message confirmant ma nouvelle session (très bien!).Omniauth Connexion Facebook redirige pour inscription si utilisateur existe

Problème: Toutefois, lorsqu'un compte existe déjà, en cliquant sur le lien, je suis redirigé vers la page user/sign_up. J'ai suivi this documentation depuis le wiki de Devise. Il y a une bonne partie de la documentation sur des erreurs similaires here, here, here et here. Chacune des solutions, cependant, est déjà implémentée dans mon application (pour autant que je sache) OU (dans le cas du dernier lien) semble être basé sur un ancien modèle de configuration qui semble assez différent du wiki que je '' Je ne suis pas sûr que c'est applicable.

Ma meilleure estimation est qu'il a quelque chose à voir avec le contrôleur callbacks, comme @user.persisted? semble être à venir false.This me porte à croire que ma définition de @user n'est pas correct. Voir ci-dessous:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def facebook 
    logger.debug "Inside facebook" 
    # You need to implement the method below in your model (e.g. app/models/user.rb) 
    @user = User.from_omniauth(request.env["omniauth.auth"]) 
    logger.debug "User is #{@user}" 

    if @user.persisted? 
     logger.debug "@user.persisted?" 
     debugger 
     sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
     set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format? 
     logger.debug "user exists" 
    else 
     session["devise.facebook_data"] = request.env["omniauth.auth"] 
     redirect_to new_user_registration_url 
    end 
    end 

    def failure 
    redirect_to root_path, alert: "Login failed" 
    end 
end 

De plus, mon modèle d'utilisateur se présente comme suit:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
       :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:facebook] 

    def self.from_omniauth(auth) 
     where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
      user.provider = Devise.friendly_token[0,20] 
      user.email = auth.info.email 
      user.password = Devise.friendly_token[0,20] 
      user.fname = auth.info.first_name 
      user.lname = auth.info.last_name 
     end 
    end 
end 

Toute suggestion serait certainement le bienvenu! Merci d'avance.

+0

Avez-vous la méthode 'after_sign_in_path_for' partout dans votre projet? – chumakoff

Répondre

0

from_omniauth ne trouve jamais un utilisateur facebook existant parce que vous écrasez l'attribut fournisseur:

where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 

recherches pour un utilisateur avec le fournisseur « facebook » dans ce cas, mais aucun ne peut être trouvé:

user.provider = Devise.friendly_token[0,20] 

change le fournisseur à un jeton aléatoire

supprimez simplement cette ligne et cela devrait fonctionner correctement

0

Essayez quelque chose comme ça

class Authentication < ActiveRecord::Base 

    belongs_to :user 
    # validates :provider, :uid, :presence => true 

    def self.from_omniauth(auth) 
    authenticate = where(provider: auth[:provider], :uid=>auth[:uid]).first_or_initialize 
     if authenticate.user 
      authenticate.provider = auth[:provider] 
      authenticate.uid =auth[:uid] 
     else 
      user = User.find_or_initialize_by(:email => email) 
      authenticate.provider = auth[:provider] 
      user.email = email 
      user.first_name = first_name 
      user.last_name = last_name 
      user.social_image = image 
      user.password = Devise.friendly_token.first(8) 
      user.save(validate: false) 
      if user.errors.any? 
       return user 
      else 
      authenticate.user_id = user.id 
      end 
     end 
     authenticate.save 
     authenticate.user 

     end 
    end 
1

Essayez cette

def after_sign_in_path_for(resource) 
     super resource 
    end 

D'après ce que je percevais que vous n'allez à votre page de destination