この 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 つのシナリオに対する解決策が何であれ、配管工事が関係していると思いますので、事前に回答していただければ幸いです。