

Android4.0向けにアプリを作成しており、  
その中でFacebookで認証(OAuth)をしたいと思っています。

FacebookSDKで用意されている  
`Session`や、GUIコンポーネントの`UserSettingsFragment`や`LoginButton`を使ってみたのですが、  
端末にFacebookアプリが入っている場合、  
自動的にFacebookアプリの方で認証をしようとします。

これをFacebookアプリが入っていようと無かろうと  
同じ動作にしたいのですが、方法をご存知な方がいたら教えてください。  
もしくは公式アプリを使わずに純粋にOAuth認証だけをする方法がありましたらご教授下さい。


CC BY-SA 3.0
2015-01-23T09:52:04.460
5152
2015-08-03T17:36:41.453
2015-01-23T13:26:36.827
845
401
question
android facebook
AndroidアプリでFacebookのログイン認証を公式アプリに行わせない方法


必ず公式アプリを使ってログインさせる、という方法ではいかがでしょうか。  
手順としては以下のようにすると良いと思います。

  1. アプリ起動時に、PackageManagerを使ってFacebookアプリのインストール状況を確認する  
参考 : <http://9ensan.com/blog/smartphone/android/android-install-list/>

  2. Facebookアプリがインストールされていなければ、インストールが必要であることをユーザに通知し、GooglePlayのFacebookアプリページに遷移させ、自アプリは閉じる

Uri uri = Uri.parse("market://details?id=com.facebook.katana");  
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(intent);  
finish();


CC BY-SA 3.0
2015-02-02T22:57:19.917
5809
2015-02-02T22:57:19.917
7572
5152
answer


かなりトリッキーで、かつ勝算も低いのですが、もう一つ試せそうな方法があります。

  1. WebView経由で、FacebookのJavascriptSDKを使い認証させます。
  2. WebViewをjavaから操作してFacebookにアクセスし、必要な情報をスクレイピングします。

一応参考に書いておきます：  
WebViewからクッキー値かJavascript変数値に格納されているだろうトークンを取得して、FacebookAndroidSDKに渡せばセッションハイジャックする案も検討しましたが、アプリ別にID管理されるためJavascriptアプリとAndroidアプリでトークンを共有するのは無理かと判断しました。


CC BY-SA 3.0
2015-02-02T23:07:20.227
5810
2015-02-02T23:07:20.227
7572
5152
answer


なぜ「Facebookアプリが入っていようと無かろうと同じ動作にしたい」のでしょうか？

@tokoi さんがかかれているように、WebView
を使って自分でサーバーサイドでOAuthを処理するコードをかき、WebView経由で利用すれば実装できなくもないですが、この場合は「Facebookアプリを使っているにもかかわらず再度WebView上でユーザー名/パスワードを要求される」といったエクスペリエンスの低下などが懸念されます。

また、Facebook社の規約 (<https://developers.facebook.com/policy/Japanese/>) をみると、7.2
で

> Facebookログインを実装するネイティブiOSアプリおよびAndroidアプリは、公式のログイン用SDKを使用する必要があります。

とありますので、SDKで定義されているフローを回避するのは規約の観点からみても得策とはいえないと思います。


CC BY-SA 3.0
2015-02-04T00:59:46.027
5901
2015-02-04T00:59:46.027
2407
5152
answer


以前、特定の端末でのみ発生するバグを回避するために、そのような対応を行ったことがあります…が、当時とソースが変わりすぎていて直接的な回答はできません、すみません。

<https://github.com/facebook/facebook-android-sdk>  
にSDKのソースコードが開示されていますので、その中から 公式アプリ(package名:
com.facebook.katana)に対する操作を削れば実現できるはずです。

ソースコードをgrepしただけで実際に試してはいないのですが、  
com/facebook/internal/NativeProtocol.java  
の[`buildFacebookAppList`メソッド](https://github.com/facebook/facebook-android-
sdk/blob/master/facebook/src/com/facebook/internal/NativeProtocol.java#L318)で空リストを返すようにしてしまえば(認証だけでなく他の操作も道連れになりそうですが)ネイティブアプリを使用しないようにならないでしょうか。


CC BY-SA 3.0
2015-08-03T17:36:41.453
13002
2015-08-03T17:36:41.453
2808
5152
answer