5

この Q&A スレッドに従って、ユーザーがポップアップを使用して Omniauth Facebook 戦略を介してログインできるようにしました。これが私のコードです:

見る:

<%= link_to("Sign in with Facebook", "/auth/facebook", :id => "signin", 
:data => {:width => 600, :height => 400}) %>

アプリケーション.js:

function popupCenter(url, width, height, name) {
  var left = (screen.width/2)-(width/2);
  var top = (screen.height/2)-(height/2);
  return window.open(url, name, "menubar=no,toolbar=no,status=no,width="+width+",height="+height+",toolbar=no,left="+left+",top="+top);
}

$(document).ready(function() {
  $('a#signin').click(function(e) {
    popupCenter($(this).attr('href'), $(this).attr('data-width'), $(this).attr('data-height'), 'authPopup');
    e.stopPropagation();
    return false;
  });
});

セッションコントローラー.rb:

  def create
    user = AuthProviders::FacebookUser.find_or_create_user_from(auth_hash)
    session[:current_user_id] = user.id
    @return_to = origin || root_url
    render :callback, :layout => false
  end

  protected

  def auth_hash
    request.env['omniauth.auth']
  end

  def origin
    request.env['omniauth.origin']
  end

ビュー/セッション/callback.html.erb:

<script type="text/javascript">
  if (window.opener) {
    window.opener.location = '<%= @return_to %>';
  }
  else {
    window.location = '<%= @return_to %>';
  }
  return window.close();
</script>

これはうまく機能しますが、次の 2 つの追加シナリオを処理できるコードが必要です。

(1) ユーザーがリンクをクリックすると、コントローラーのアクションは単純な古い HTML 応答をレンダリングしますが、そのページは current_user が存在する (つまり、サインインしている) 場合にのみ表示できます。リンクをクリックすると、ユーザーはポップアップを使用して Facebook 経由でサインインする必要があります。認証されると、ユーザーは元のリクエスト ページに転送されます。 たとえば、ユーザーがこのリンクをクリックすると、ログインしていないため、Facebook 経由でサインインするように求められ、要求されたページに戻ります。

<%= active_link_to("Your Stuff", user_stuff_path(current_user), :wrap_tag => :li) %>

ポップアップを使用していない場合、これはHartly の Friendly Forwarding の章を使用して非常に簡単に行うことができます。

(2) もう 1 つのシナリオは (1) と似ていますが、html の代わりにコントローラー アクションが JavaScript をレンダリングし、(Twitter ブートストラップ) モーダル ダイアログを開きます。このモーダル ボックスを表示するには、ユーザーがサインインする必要があるため、アプリはユーザーに Facebook 認証ダイアログを表示してから、ユーザーをモーダル ボックスに戻す必要があります。私のアプリのサンプルリンクは次のとおりです。

<%= link_to(event.home_pick_path, :remote => true, :class => "#{event.home_button_class}", :rel => "tooltip", :data => {:placement => "top", "original-title" => "#{event.home_bet_tooltip}"}) do %>
  <div class="team-name"><%= event.home_team_nickname %></div>
<% end %>

リクエスト URL は次のようになります/picks/new?pick_line_id=1&pick_num=1

したがって、これら 2 つのシナリオに対する解決策が何であれ、配管工事が関係していると思いますので、事前に回答していただければ幸いです。

4

1 に答える 1

0

私はあなたがエンジニアリングを超えていると思います。私は非常に単純なアプローチを採用しますが、もちろんそれはビジネス ロジックに依存します。

現在のユーザーがいない場合、「ログイン」ボタンを使用して同じ URL「401」テンプレートにレンダリングすると、Fb ログイン ボタンがトリガーされます。

コールバックで(テストされていません)。

def create
  if session[:redirect_to].nil?
    session[:redirect_to] = origin
  end
  user = AuthProviders::FacebookUser.find_or_create_user_from(auth_hash)
  session[:current_user_id] = user.id
  unless session[:redirect_to].nil?
    redirect = session[:redirect_to] || root_url
    session[:redirect_to] = nil
    redirect_to redirect
  end 
end

もちろん、必要ないので、それを処理するためのテンプレートはありません。

于 2012-11-16T08:12:36.180 に答える