私が正しく理解していれば、私のデスクトップアプリケーションから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の、ダイアログにログインされていない場合は、
- ユーザー認証、表示されます。リソースの所有者がログインしている場合、セッションはFacebookのサーバー上のCookieを使用して認証されます。セキュリティ - CHECK V!
- アプリの権限がまだアプリに与えられていない場合、権限のダイアログはリソースのオーナーからアプリに権限を与えるように頼みます。示される。セキュリティ - CHECK V!
- アプリ認証 - ここでは、粘着性があるところです。ガイドには、「アプリケーション認証は、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や根っこのアンドロイドにはいくつかの違いがありますか?
乾杯!
少なくともiPhoneでは、別のapp_idへのトークン要求ごとにログインする必要があります。開発者がSDKを使用しないようにするにはどうすればよいのですか?標準APIを使用してaccess_tokenをリクエストしますか? – fudge