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.
Avez-vous la méthode 'after_sign_in_path_for' partout dans votre projet? – chumakoff