31

ページをリロードせずに、ユーザーが自分の Facebook ID を使用して自分の Web サイトにログインできるようにしたいと考えています。これが、私がFacebook Javascript SDKを使用する理由です。このスキームは、この SDK を使用した承認フローを示しています。 ここに画像の説明を入力

プロセスの最後に、ユーザーがログインしていることと、Facebook ID を知っています。次に、この ID を使用してそれらをデータベースに登録し、後でそれを使用してログインできるようにします。

ただし、これは非常に安全ではないようです。サーバー側のスクリプトにユーザーの ID を知らせるために、AJAX 経由で送信する必要があります。ただし、ログインしようとしているのが ID の所有者であるかどうかを知る方法はありません。誰でも ID を使用して POST 要求を送信できます (特に、別のユーザーの ID を取得した場合)。

私の現在の考えは、ユーザーが通常どおり JS SDK 経由でログインできるようにし、ID とアクセス トークンを AJAX 経由でサーバーに送信し、PHP スクリプトで cURL を使用して、ユーザーが実際にログインしていることを確認することです。

これは進むべき道ですか、それともより良い代替案を見落としていますか?

4

2 に答える 2

27
  1. ユーザーの ID を ajax 経由でプッシュする必要はありません。サーバー側では、signed_request を保持する fbsr_{app_id} Cookie を使用する必要があります。FB によって発行された「シークレット」app_secret を使用してこの signed_request を解析し、「user_id」を取得します。注: 解析が成功すると、FB によって提供された Cookie データが改ざんされていないことも示されます。

  2. signed_request を解析したら、'issued_at' 時刻も取得する必要があります。この時間が過去 10 分以内であることを確認します。これにより、(user_id を持つ) ユーザーがクライアント側の SDK を使用したため、ログイン要求がサーバーにヒットしたことがわかります。(参照: http://developers.facebook.com/roadmap/completed-changes/ )

  3. このコードをすぐに access_token に交換する必要があります。これが失敗した場合 (FB は OAuthException タイプのエラー メッセージを表示します)、ユーザーが facebook にサインインしてからログイン リクエストを取得するまでに不自然な遅延があったことを意味します。

ステップ 2 では、古い fbsr_ Cookie を使用した攻撃の試みを阻止できます。ユーザー (user_id から) が既にあなたのアカウントを持っている場合は、ここで停止してユーザーにログインすることをお勧めします。ただし、app_secret が侵害される可能性があるシナリオが存在する可能性があります。このケースに対処するには、手順 3 に従っください。ユーザーがあなたのサイトのアカウントを持っていない場合は、ステップ 3 で access_token を使用して、FB から名前、電子メールなどの他の必要なユーザー データを取得する必要があります。

したがって、誰かが被害者の Cookie を盗んで攻撃しようとする可能性があるのは、この 10 分間のセキュリティ ギャップ内だけです。このセキュリティ ホールに不満がある場合は、サーバー側認証に移行する必要があります。決定は、保存するユーザー情報の機密性によって異なります。また、サーバー側の認証に移行することで妥協することはありません。同時に、クライアント側のメソッドを他のことにも引き続き使用できます。

于 2013-01-08T23:38:43.193 に答える
9

JS SDKを介してユーザーにログインすると、資格情報を含む特別なCookieが設定されます(私が正しければ、秘密鍵でエンコードされます)。この情報は、 PHPSDKgetUser()メソッドを介して使用できます。

API(ajaxエンドポイント)がアプリと同じドメインにある限り、ユーザーがサーバーをリクエストするたびにこのCookieを受け取る必要があります。

もちろん、Javascript SDKが正しくセットアップされていること、cookie: trueconfigオプションを使用していること、および有効なchannelファイルを指定していることを確認する必要があります。これらの要件が満たされていない場合は、IEおよびSafariでのクロスドメイン通信およびサードパーティのCookieで問題が発生する可能性があります。

この関連する質問を確認することもできます:FB認証への適切なアプローチ

于 2013-01-06T21:30:47.833 に答える