0

次の問題があります。私のアプリはFacebookアプリとして実行されていますが、ユーザーが初めてFacebookのアクセス許可を受け入れると、正しいURLにリダイレクトされますが、Facebook(キャンバス)の外部にリダイレクトされます。どうすれば修正できますか?

これが私の実際の設定です:

devise.rb:config.omniauth :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_SECRET'], scope: "email,publish_stream"

app / controllers / omniauth_callback_controller.rb

class OmniauthCallbacksController < Devise::OmniauthCallbacksController

      def passthru
      render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
      end


      def facebook

        @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

        if @user.persisted?
          flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"

          sign_in_and_redirect @user, :event => :authentication
        else
          session["devise.facebook_data"] = request.env["omniauth.auth"]
          redirect_to root_path
        end
      end

      def after_sign_in_path_for(resource)
        inicio_path
      end
    end

ルート.rb

Pl::Application.routes.draw do



      ActiveAdmin.routes(self)

      mount Resque::Server, :at => "/resque"

      devise_for :admin_users, ActiveAdmin::Devise.config

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

      devise_scope :user do
      get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru'
      end

      match 'states'  => 'game_plays#states'
      match 'cities'  => 'game_plays#cities'
      match 'parties' => 'game_plays#parties'
      match 'prefeito' => 'game_plays#prefeito'
      match 'prefeitos' => 'game_plays#prefeitos'
      match 'vereadores' => 'game_plays#vereadores'
      match 'parties' => 'game_plays#parties'
      match 'qualities' => 'game_plays#qualities'
      match 'start' => 'game_plays#start'
      match 'generated_image' => 'game_plays#generated_image'
      match 'save_game_play' => 'game_plays#save_game_play'
      match 'final' => 'game_plays#final', :as => :final

      match 'inicio'  => 'game_plays#index'  


      root :to => 'game_plays#bem_vindo'

    end

何か疑惑はありますか?

4

1 に答える 1

0

これは、この問題に関する数か月前の私自身の経験からのものであり、お役に立てば幸いです。

Facebook の観点からすると、これはまさに Facebook がすべきことです。リクエストがどこから来ているかの違いを認識しません。iframe にとどまるようにするには、リクエストのリダイレクト URL を変更する必要があります。

これを行う最も簡単な方法は、iframe の URL を my_website.com/fb-app に移動することでした。これにより、セッション変数が設定され、キャンバスにいることがわかり、Facebook 経由で既にログインしていることを確認できます。その後、キャンバス サイトにリダイレクトされ、サイトは通常どおり続行され、ユーザーは何も気付かない.

def fbapp

  session[:fbapp] = true

  if user_signed_in? == false
    redirect_to user_omniauth_authorize_path(:facebook)
  else
    redirect_to $APP_CANVAS_URL + "?auth_token=" + current_user.authentication_token
  end
end

次に、Application_controller.rb でリダイレクト パスを変更する必要があります。これは私のアプリケーションではどのように見えるかです。 $APP_CANVAS_URL はhttps://apps.facebook.com/your_app_hereのようなものでなければなりません

def after_sign_in_path_for(resource_or_scope)  
  if session[:fbapp] == true
    $APP_CANVAS_URL + "?auth_token=" + current_user.authentication_token
  else
    root_path
  end
end

これが最善の方法であるとは思えませんが、何時間ものフラストレーションを経て、私はこの方法にたどり着きました。お役に立てば幸いです。

于 2012-08-13T20:43:32.850 に答える