Ich spiele mit dem omniauth-facebook
Juwel herum, um mich über einen Facebook-Account in eine Gerätesitzung einzuloggen. Wenn ich auf den Link "Anmelden mit Facebook" klicke, läuft alles gut: Ein neues Konto wird erstellt, ich bin angemeldet und prompt mit einer Nachricht, die meine neue Sitzung bestätigt, zurück zur Homepage (sehr gut!).Omniauth Facebook Login leitet weiter, wenn der Benutzer existiert
Problem: jedoch, wenn ein Konto bereits vorhanden ist, nach dem Klicken auf den Link ich auf die user/sign_up
Seite umgeleitet werde. Ich habe this documentation aus dem Devise-Wiki verfolgt. Es gibt eine ganze Reihe von Dokumentationen über ähnliche Fehler here, here, und here. Jede der Lösungen ist jedoch bereits in meiner App implementiert (soweit ich das beurteilen kann) ODER (im Falle des letzten Links) scheint auf einem älteren Konfigurationsmodell zu basieren, das sich ausreichend von dem Wiki unterscheidet, das ich ' Ich bin mir nicht sicher, ob es anwendbar ist.
Meine beste Vermutung ist, dass es etwas mit den Rückrufen Controller zu tun, wie @user.persisted?
kommen zu sein scheint false.This führt mich zu glauben, dass meine Definition von @user
ist nicht korrekt. Siehe unten:
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
Zusätzlich mein Benutzermodell ist wie folgt:
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
Irgendwelche Vorschläge sicherlich willkommen sein würde! Danke im Voraus.
Haben Sie in Ihrem das 'after_sign_in_path_for' Methode überall haben werden Projekt? – chumakoff