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)
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 ... –