1

Ryan のFacebook 認証に関するRailscastでは、最後に Facebook SDK JavaScript を追加して、「サーバー側の認証で Facebook のクライアント側の認証を低下させる」ようにしています。しかし、私はそれの使用を見ていません。omn​​iauth を使用してサーバー側からの承認を既に設定している場合、クライアント側の承認を再度追加する必要があるのはなぜですか? どんな違いがあるの?

参照されている 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 を見てまだ混乱していたので、混乱しているかもしれない人のために少し説明を加えたいと思います。

これが機能する方法:

  1. Facebook SDK は、ページの読み込み中に初期化されます。
  2. ユーザーは「Facebook でログイン」リンクをクリックします。
  3. FB.login関数はリンクによって呼び出され、ユーザーはすべてのアクセス許可プロセスを実行します (たとえば、ユーザーのアクセス許可を求めるアクセス許可ダイアログが表示されます)。
  4. 次に、ユーザーは に移動し/auth/facebook/callbackます。からroutes.rb行がありmatch 'auth/:provider/callback', to: 'sessions#create'ます。したがって、サーバーは新しいユーザーを作成するか、ユーザーが以前に登録済みの場合は単にセッションを作成します。
  5. 終わり!ユーザーがログインしています。

サーバー側とクライアント側の承認をマージすることには、2 つの大きな利点があります。逆に、ユーザーが Facebook の外でログインした場合、後で Facebook 内でアクセスすると自動的にログインされます。2./auth/facebookユーザーが Facebook iFrame 内でログインしている場合、 でのログインは機能しません。クリックジャッキングを防止するために、Facebook では、Facebook iFrame 内でユーザーに権限ダイアログを認証するよう求めることを禁止しています。これを回避する唯一の方法は、別のポップアップでダイアログを開き、ログインしFB.loginて問題を解決することです。

4

2 に答える 2

1

簡単に言えば、そうではありません。クライアント側のログイン ( javascript SDK経由) とサーバー側のログイン( omniauth
を使用) のどちらかを選択できます。 サーバー側ログインの欠点は、クライアントから実行できる呼び出しのためにサーバーに過負荷をかけることです。 利点は、通常、トークンが長くなることです (クライアント側のように 1 ~ 2 時間ではなく、3 か月のトークン)。2つを組み合わせる ことをお勧めします。最初のログインにはクライアント側を使用します。これを行うと、サーバー側から拡張トークンの非同期呼び出しが行われます (必要な場合のみ)。


于 2013-02-19T09:14:42.280 に答える
1

それはただ言う、

Facebook は、クライアント側でユーザーを認証するために使用できる JavaScript SDK を提供しているため、ユーザーがアプリケーションを離れて戻ってきたようには見えません。

これは、ユーザーがアプリケーションから戻ったときに、実際にアプリケーションを離れたようには見えないことをクライアント側が理解するためのものであることを意味します。

于 2013-02-19T08:30:51.680 に答える