2016-04-20 20 views
0

Ich bin versucht Facebook-Login auf meine Rails 4 Website Einhaltung der folgenden Anweisungen hinzufügen:ERR_TOO_MANY_REDIRECTS mit OmniAuth/Devise/Rails anmelden

https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

ich zur Zeit mit Devise und Pundit für Autorisierung und Authentifizierung . Obwohl ich die Anweisungen meiner besten Fähigkeiten befolgt habe, erhalte ich einen Fehler. Wenn ich meine „Login mit Facebook“ klicken, öffnet sich ein Fenster, das für E-Mail/Passwort fragt, und wenn ich diese Informationen einreichen, erhalte ich eine Fehlerseite, die lautet:

[MyApp.com] Seite isn 't funktioniert

[MyApp.com] Sie zu oft umgeleitet.

Versuchen:

  • Neuladen der Seite
  • Clearing-Cookies ERR_TOO_MANY_REDIRECTS

Es scheint so, irgendwie habe ich eine Umleitung Schleife eingeführt, aber ich nicht wirklich verstehen, die Datenfluss, so ist es schwer zu finden, wo ich falsch gelaufen bin.

Hier ist meine routes.rb:

Rails.application.routes.draw do 
    get 'home/index' 

    devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks", sessions: "sessions" } 

    resources :movies 
    root 'home#index' 
end 

omniauth_callbacks_controller.rb:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    before_filter :authenticate_user, :except => [:new, :create, :destroy] 
    def 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"]) 

    if @user.persisted? 
     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? 
    else 
     session["devise.facebook_data"] = request.env["omniauth.auth"] 
     redirect_to new_user_registration_url 
    end 
    end 

    def failure 
    redirect_to root_path 
    end 
end 

OmniAuth Konfiguration in config/initializers/devise.rb:

config.omniauth :facebook, '[APP ID]', '[APP SECRET]', callback_url: "https://#{ENV['C9_HOSTNAME']}/users/auth/facebook", 
    :client_options => {:ca_file => '/usr/lib/ssl/certs/ca-certificates.crt'} 

Mein Benutzermodell (user.rb):

class User < ActiveRecord::Base 
    rolify 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, and :timeoutable 
    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.email = auth.info.email 
     user.password = Devise.friendly_token[0,20] 
    end 
    end 

    def self.new_with_session(params, session) 
    super.tap do |user| 
     if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] 
     user.email = data["email"] if user.email.blank? 
     end 
    end 
    end 
end 

Und der Link in meiner Ansicht (mit HAML):

%button 
    = link_to "Log in with Facebook", user_omniauth_authorize_path(:facebook) 

Antwort

1

ich genau dieses Problem zu einfach gehabt habe! Nachdem Sie diesen Fehler erhalten haben, konnten Sie die Seite neu laden, und Sie hatten sich tatsächlich eingeloggt? Wenn ja, dann hatte ich das. Die Anmeldung funktionierte - aber die Weiterleitungen waren nicht gut.

Haben Sie in der Funktion after_sign_in_path_for(resource) zu der application_controller.rb hinzugefügt, die die Seite nach der Anmeldung umleitet? Ich hatte und deshalb sind die Weiterleitungen aufgetreten.

Meine Lösung war, die if-Anweisung zu korrigieren, um den richtigen Referrer einzuschließen. Ich habe gerade in || request.referer.include?("google") hinzugefügt, natürlich müssen Sie es möglicherweise ändern, um "Facebook" in der Referrer-URL zu berücksichtigen.

def after_sign_in_path_for(resource) 
    sign_in_url = new_user_session_url 
    if request.referer == sign_in_url || request.referer.include?("google") 
    super 
    goals_path 
    else 
    stored_location_for(resource) || request.referer || root_path 
    end 
end 

Jetzt ... wenn Sie diese Funktion nicht verwendet haben, wird meine Antwort für Sie nutzlos sein. Viel Glück.

+0

Dies war vor einer Weile, aber ich glaube, einige der Dokumentation war veraltet oder so. Ich habe das Gefühl, dass ich diesen Code letztendlich viel gestrafft habe. Vielleicht hat Omniauth später ein Update bekommen ... –