2016-08-04 8 views
1

Facebookのドキュメントは、AppシークレットまたはアプリケーションのアクセストークンXamarin.Auth 1.3はFacebookのOAuthで安全に動作しませんか?

が アプリの開発者以外の者がアクセスすることができいかなる コードに含まれるべきではありませんと述べています。これは、クライアント側コード(HTMLやJavascriptなど) や、逆コンパイル可能なネイティブアプリ( iOS、Android、Windowsデスクトップアプリなど)のように保護されていないコードのすべてのメソッドに適用されます。このためhttps://developers.facebook.com/docs/facebook-login/security#appsecret

、Appの[詳細設定]の下のあなたの「アプリケーションの種類が」 ダッシュボードは、ネイティブ/デスクトップに設定されている場合、我々はあなたのネイティブアプリ がバイナリでのApp秘密やアプリケーションのアクセストークンが含まれていることを前提とし、 は、App Access Tokenで署名された呼び出しを続行しません。 API は、アクセストークンが提供されていないかのように動作します。

したがって、アプリにApp Secretを埋め込み、それについてFacebookに伝えれば、OAuthでの作業が中止されます(このオプションをチェックすると、Facebookは秘密の検証を中止します)。

しかしXamarin.Auth 1.3(最新の安定)clientSecretが必要です(OAuth2AuthenticatorクラスclientSecretに必要なパラメータである)と、ユーザーが正常にログインすると、Facebookのアクセストークンを取得するためにそれを使用しています。

だから、バグであります回避策があります.Xamarin.Authは現在Facebookで役に立たないのですか?

+0

私はあなたはそれが – SushiHangover

答えて

1

OAuth2Authenticatorは、複数のコンストラクタが含まれているとClientSecretを必要としないものがあります:

public OAuth2Authenticator (string clientId, string scope, Uri authorizeUrl, Uri redirectUrl, GetUsernameAsyncFunc getUsernameAsync = null) 

この1つはのOAuth2の暗黙的な流れにをできるようになりますので、アプリケーションのコード内に格納されるように、クライアントの秘密を必要としませんが。

参考:https://github.com/xamarin/Xamarin.Auth/blob/9c19d90e52994188def9e12e0bbc981a3943a752/src/Xamarin.Auth/OAuth2Authenticator.cs#L110

1

物事を混乱させません。これはXamarin.Authとは関係ありません。

のOAuth2のための2つの主要なオプションがあります。

  1. 暗黙の流れ
  2. 認証コードフロー

は暗黙の流れがないは、クライアントシークレットが必要です。暗黙のフローは、通常、モバイルアプリで使用されます。なぜなら、彼らは秘密を保持できないからです(あなたはアプリのバイナリを逆アセンブルしてその秘密を見つけることができます)。 Javascriptやデスクトップアプリでも同じです。秘密を守る唯一の方法は、それがサードパーティ(=ユーザー)によってアクセスできないサーバーに格納されている場合です。

承認コードフローでは、クライアントシークレットがadditional protectionとして使用されます。シークレットはサーバーのような特定のパーティを識別します。

Facebookの状態はどうですか? Facebookのダッシュボードでアプリをネイティブ/デスクトップアプリに設定した場合、バイナリに秘密を保存することを前提としています(理由はどこですか?結果として、その秘密はもはや本当の秘密ではなく、したがって、秘密がそこになかったかのようにFacebook APIが機能します。

2種類の溶液:

  • あなたは
  • (私は多分、「サーバー」、Facebookが使用する用語を知らない)としてではないネイティブ/デスクトップのアプリケーションを設定するか、暗黙のフローを使用しますかモバイルクライアント向けに設計されています。

はい、Xamarin.Authは他のOAuth2と同じようにFacebookのOAuth2をサポートしています。

+0

ありがとう、私は、なぜXamarin.Authを求めています;-)働いてしまった非* ClientSecret *ベースのコンストラクタ...うれしいとあなたのために別の答えを追加しましたアプリケーションにクライアントシークレットを埋め込む必要があり、アプリを動作させるにはどうすればいいのでしょうか(Facebookでネイティブアプリを設定すると、Xamarin.Authが使用するOauthフローが機能しなくなり、秘密の検証が失敗します)あなたの秘密が妥協されないなら(バイナリになるので、どのユーザが逆アセンブルできるかなど)、答えを知っていればこれについて何か言ってください... – Bob

+0

それはできません。モバイルアプリにクライアントシークレットを含めると、クライアントシークレットは保護されず、秘密にもなりません。しかし、誰もこれをやめることを止めません。 *暗黙の*フローの場合、クライアントの秘密は必要ありません。 Facebookはクライアントの秘密を含んでいるアプリを検出しません。彼らはチェックする:アプリはネイティブ/デスクトップ/モバイルアプリとして設定されていますか?はいの場合は、クライアント秘密を使用しようとしますか?はいの場合は、秘密とはみなされないため、受け入れないでください。 – Krumelur

+2

@Bobあなたが間違ったコンストラクタを使っているかもしれないと思うかもしれませんが、*必須* 'ClientSecret'を使わないでください:public OAuth2Authenticator(string clientId、string scope、Uri authorizeUrl、Uri redirectUrl、GetUsernameAsyncFunc getUsernameAsync = null) ':https://github.com/xamarin/Xamarin.Auth/blob/9c19d90e52994188def9e12e0bbc981a3943a752/src/Xamarin.Auth/OAuth2Authenticator.cs#L110 – SushiHangover

関連する問題