2016-04-20 25 views
0

私は私のRailsにこれらの指示に従って4サイトFacebookのログインを追加しようとしている:私は現在、認可と認証のための工夫や評論家を使用していERR_TOO_MANY_REDIRECTS

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

を。私の最高の能力への指示に従ったにもかかわらず、私はエラーが発生しています。私は私の「ログインFacebookの持つ」ボタンをクリックすると、ウィンドウは、電子メール/パスワードの入力を要求しているポップアップし、私はその情報を送信すると、私は、読み込みエラーページを取得:

[MyApp.com]ページのISNを「がトン作業

[MyApp.com]あなたにリダイレクト回数が多すぎます。

試してみてください。

  • は、Cookieを削除するページのリロードが

をERR_TOO_MANY_REDIRECTSどういうわけかのように、私はリダイレクトループを導入しましたようだが、私は本当に理解していませんデータの流れがあるので、どこに間違っているのか分かりにくいです。ここで

は私の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ます。config /初期化子/ devise.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の設定:

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'} 

私のユーザモデル( 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 

と(HAMLを使用して)私の見解でリンク:

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

答えて

1

私はあまりにもこの正確な問題を持っていました!このエラーが発生した後、ページをリロードできて、実際にログインしていましたか?もしそうなら、それは私が持っていたものです。ログインはうまくいったが、リダイレクトはうまくいかなかった。

ログイン後にページをリダイレクトするapplication_controller.rbに機能after_sign_in_path_for(resource)を追加しましたか?私はリダイレクトが発生した理由を知りました。

私の解決策は、正しいリファラーを含むようにif文を修正することでした。私はちょうど|| request.referer.include?("google")で追加しましたが、あなたは参照元のURLの 'facebook'のアカウントに変更する必要があるかもしれません。

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 

今、あなたがその機能を使用していない場合、私の答えは役に立たないでしょう。がんばろう。

+0

これはしばらく前のことでしたが、ドキュメントの一部が期限切れであったと思います。最終的にこのコードを合理化したような気がします。たぶんomniauthは後で更新されたかもしれない... –

関連する問題