2011-02-01 6 views
4

私が正しく理解していれば、私のデスクトップアプリケーションからAPIコールを呼び出すことができます(これは今からOAuth2標準のように 'クライアント'から呼び出そうとします)、アプリケーションIDとアプリケーションIDを組み合わせた識別子であるaccess_tokenを取得する必要があります。ユーザ、誰がアクセスしたいのか、id( 'resource owner')。redirect_uriを使ったFacebookのクライアント側認証フローはボルケンですか?

認証ガイド(developers.facebook.com/docs/authentication/)上のクライアントの流れに続いて、私は時間にリクエストを送信する必要があることを理解** PS:?//www.facebook.com/dialog/oauthのclient_id = YOUR_APP_ID & REDIRECT_URI =のhttp:// example.com & response_type = token。結果として、ページはh ** p://example.com/#access_token=XXXにリダイレクトされます。クライアントが純粋なデスクトップアプリケーションの場合、redirect_uriはh ** p://www.facebook.com/connect/login_success.htmlになります。クライアントがWebコントロールを所有しているので、access_tokenはリダイレクトされたアドレスから簡単に抽出できます。

クライアントサイドフローは3つのOAuthのステップで構成されます。リソースの所有者がFacebookの資格情報を求め、Facebookの、ダイアログにログインされていない場合は、

  1. ユーザー認証、表示されます。リソースの所有者がログインしている場合、セッションはFacebookのサーバー上のCookieを使用して認証されます。セキュリティ - CHECK V!
  2. アプリの権限がまだアプリに与えられていない場合、権限のダイアログはリソースのオーナーからアプリに権限を与えるように頼みます。示される。セキュリティ - CHECK V!
  3. アプリ認証 - ここでは、粘着性があるところです。ガイドには、「アプリケーション認証は、redirect_uriがデベロッパーアプリケーションで設定されたサイトURLと同じドメインにあることを確認することで処理されます。セキュリティ - 私の意見で - FAIL

なぜ私は最後のステップがセキュリティに失敗したと思いますか?まず、app idとredirect_uriは誰​​でも入手できる公開情報です。もうひとつは、redirect_uriはh ** p://www.facebook.com/connect/login_success.htmlです。

以下のシナリオを見てみましょう。デスクトップアプリケーションであるEVEは、ユーザーがFacebookにログインしてEVEに基本的な権限を与えるWebコントロールをユーザーに示します。リソース所有者は何も疑う必要はありません。次に、EVEはWebコントロールを隠し、読み込みを試みます。h ** ps://www.facebook.com/dialog/oauth?client_id = OTHER_APP_ID & redirect_uri = http://www.facebook.com/ connect/login_success.html & response_type = token。アプリは最も人気のあるFacebookのアプリケーションのアプリケーションIDでこのURLを試して読み込むことができます。ログインダイアログと権限ダイアログの両方が表示されないため、ユーザーが以前にOTHER_APPを承認していれば、成功メッセージが表示されます。これにより、リソース所有者がOTHER_APPに付与し、EVEに付与しなかったリソース所有者のすべてのリソースにアクセスするaccess_tokenがEVEに与えられます。

これはセキュリティホールですか?私は次のことで何かを逃しましたか?

(UPDATE)

が明らかにデスクトップアプリケーションの場合には、セキュリティ上の問題は無関係なアプリは、すでにユーザ名とFacebookのセッション、さらには、ユーザー名とパスワードを持っているので、それはで何かを行うことができますユーザーアカウント。

(更新) ウェブブラウザで実行されるJavaScriptアプリケーションの場合、redirect_uriは実際に動作します。 (hnrtの回答とコメントを参照)。

現在の質問: 唯一残っている謎は、iPhoneとAndroidアプリでクライアント認証がどのように機能するかです。セキュリティ全体は、デスクトップアプリケーションを使用しているときと似ていますか?脱獄されたiPhoneや根っこのアンドロイドにはいくつかの違いがありますか?

乾杯!

+0

少なくともiPhoneでは、別のapp_idへのトークン要求ごとにログインする必要があります。開発者がSDKを使用しないようにするにはどうすればよいのですか?標準APIを使用してaccess_tokenをリクエストしますか? – fudge

答えて

1

私が正しく理解していれば、EVEがFacebookとの会話に使用するのと同じWebコントロールを使用して、他のアプリの認証済みである必要があります。そうであれば、すでに大きなセキュリティ上の問題があります:) EVEはセッション全体とそのすべての認証トークンをハイジャックすることができます。

[更新] Javascriptアプリケーションに関して、same origin policyは、EVEが/dialog/oauth?client_id=OTHER_APPリクエストの返信にアクセスするのを防ぎます。データにアクセスする唯一の方法は、redirect_uriで待機し、リダイレクトされた要求を解析することです。ここで「サイトのURL」の保護が有効になる

iPhoneやAndroidアプリケーションではどのように動作するのかよく分かりませんが、Webコントロールが他のユーザーの認証データ(= Cookie)へのアクセスを許可していれば、アプリケーション。

+0

あなたはデスクトップアプリケーションについて正しいです。ユーザー名とパスワードは、アプリによってもハイジャックされる可能性があります。 JSケースに質問を更新しました。 – fudge

+0

iframe内で同じことをするJSコードがある場合、JSはこのIframeにアクセスでき、新しいURL(リダイレクト後)からaccess_tokenを読み取ることができますか? (私はウェブプログラマーではないので、間違っているかもしれません)。 – fudge

+0

いいえ、iframeに別のサイトのコンテンツがある場合、iframeのコンテンツにアクセスすることはできません。同じ起源政策。 – hrnt

関連する問題