0

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.

+0

Haben Sie in Ihrem das 'after_sign_in_path_for' Methode überall haben werden Projekt? – chumakoff

Antwort

0

from_omniauth nie findet einen bestehenden Facebook-Nutzer, weil Sie den Anbieter Attribut überschreiben:

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

sucht nach einem Benutzer mit Provider ‚facebook‘ in diesem Fall aber keine gefunden werden:

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

ändert den Anbieter zu einigen zufälligen Token

entfernen Sie einfach diese Zeile, und es sollte ordnungsgemäß funktionieren

0

Try etwas wie dieses

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

Versuchen Sie, diese

def after_sign_in_path_for(resource) 
     super resource 
    end 

Von dem, was ich wahrgenommen, dass Sie nicht auf Ihre Zielseite

Verwandte Themen