Ryan のFacebook 認証に関するRailscastでは、最後に Facebook SDK JavaScript を追加して、「サーバー側の認証で Facebook のクライアント側の認証を低下させる」ようにしています。しかし、私はそれの使用を見ていません。omniauth を使用してサーバー側からの承認を既に設定している場合、クライアント側の承認を再度追加する必要があるのはなぜですか? どんな違いがあるの?
参照されている JavaScript コードは (リンクされた Railscast から):
jQuery ->
$('body').prepend('<div id="fb-root"></div>')
$.ajax
url: "#{window.location.protocol}//connect.facebook.net/en_US/all.js"
dataType: 'script'
cache: true
window.fbAsyncInit = ->
FB.init(appId: '<%= ENV["FACEBOOK_APP_ID"] %>', cookie: true)
$('#sign_in').click (e) ->
e.preventDefault()
FB.login (response) ->
window.location = '/auth/facebook/callback' if response.authResponse
$('#sign_out').click (e) ->
FB.getLoginStatus (response) ->
FB.logout() if response.authResponse
true
アップデート:
承認をサーバー側の承認と統合する必要がある理由の 1 つはFB.login
、Omniauth サーバー側の承認が Facebook iFrame 内でアクセスされた場合に機能しない可能性があるためです。ユーザーが初めてアプリケーションにアクセスする場合、アプリケーションは許可を求める必要があります。ただし、クリックジャッキングを防ぐために、iFrame 内に oAuth 許可ダイアログを読み込むことはできません。呼び出すFB.login
と、許可ボックスがポップアップとして表示されるため、このような問題を回避できます (Omniauth ポップアップ オプションは機能しません)。
これで、クライアント側の認証を統合する正当な理由ができましたが、Railscasts のコードは現在の設定では機能しません。私は次の方法でそれを行うことにしました。
現在、次のスクリプトが my にありますapplication.html.erb
。
<script>
// Additional JS functions here
window.fbAsyncInit = function() {
FB.init({
appId : <%= ENV['FACEBOOK_KEY'] %>, // App ID
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
};
// Load the SDK Asynchronously
(function(d){
var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
ref.parentNode.insertBefore(js, ref);
}(document));
</script>
そして、私の見解では、Facebook ログインの動作を呼び出す次のリンクがあります。
<%= link_to 'log in with facebook', '/auth/facebook', id: 'fb_log_in_link' %>
ログイン リンクがあるビュー ページに次のスクリプトを追加します。
function login() {
FB.login(function(response) {
if (response.authResponse) {
window.location = '/auth/facebook/callback'
}
});
}
また、リンクを変更して、関数を呼び出すのではなく、関数を呼び出す必要があります。/auth/facebook/
<%= link_to_function 'log in with facebook', 'login()' %>
終わり!サーバー側とクライアント側の承認は完全に統合されています。Ryan の Railscast を見てまだ混乱していたので、混乱しているかもしれない人のために少し説明を加えたいと思います。
これが機能する方法:
- Facebook SDK は、ページの読み込み中に初期化されます。
- ユーザーは「Facebook でログイン」リンクをクリックします。
FB.login
関数はリンクによって呼び出され、ユーザーはすべてのアクセス許可プロセスを実行します (たとえば、ユーザーのアクセス許可を求めるアクセス許可ダイアログが表示されます)。- 次に、ユーザーは に移動し
/auth/facebook/callback
ます。からroutes.rb
行がありmatch 'auth/:provider/callback', to: 'sessions#create'
ます。したがって、サーバーは新しいユーザーを作成するか、ユーザーが以前に登録済みの場合は単にセッションを作成します。 - 終わり!ユーザーがログインしています。
サーバー側とクライアント側の承認をマージすることには、2 つの大きな利点があります。逆に、ユーザーが Facebook の外でログインした場合、後で Facebook 内でアクセスすると自動的にログインされます。2./auth/facebook
ユーザーが Facebook iFrame 内でログインしている場合、 でのログインは機能しません。クリックジャッキングを防止するために、Facebook では、Facebook iFrame 内でユーザーに権限ダイアログを認証するよう求めることを禁止しています。これを回避する唯一の方法は、別のポップアップでダイアログを開き、ログインしFB.login
て問題を解決することです。