QA@IT

Web アプリケーションの認証をfacebook4jで行う時、サインインとコールバック先でセッションIDが異なってしまう

3064 PV

AndroidアプリからWebアプリのAPIを呼んで、Facebookの機能を使うようなアプリを作ろうとしています。

Webアプリ側にはFacebook4jを組み込んで、認証を行っています。
以下のサイトを参考にサンプルソースを作成しました。
http://facebook4j.org/ja/code-examples.html
実装例がこちらです。
https://github.com/roundrop/facebook4j-oauth-example

このサンプルの中の「SignInServlet.java」に、以下のようなソースがあります。

Facebook facebook = new FacebookFactory().getInstance();
request.getSession().setAttribute("facebook", facebook);

このソースを呼び出した後、Facebook側で認証を行い、「CallbackServlet.java」を呼び出しました。
以下のようなソースがあります。

Facebook facebook = (Facebook) request.getSession().getAttribute("facebook");
String oauthCode = request.getParameter("code");

この、getAttribute("facebook")でnullが帰ってきてしまいます。
調べた所、セッションIDが異なっているのです。

クライアント端末は、Galaxy NexusのSC-04D。Androidバージョンは4.2.2です。
クライアント側のブラウザは、30.0.1599.82 です。
サーバ側のOSは、Windows7の64bitです。
webサーバはapache2.2、サーブレットコンテナはtomcat6.0、開発環境はEclipse Junoです。

クライアント端末をGalaxy SII のSC-02Cだとうまくいく(nullが帰らずにfacebookがかえってくる)のです。
その時のchromeは、18.0.1025469です。
Androidアプリの構造は、Activity内にこんな感じのソースを書いて呼びだそうとしています。

@Override
public void onClick(DialogInterface dialog, int which) {
    Uri uri = Uri.parse("apiのURL");
    Intent i = new Intent(Intent.ACTION_VIEW,uri);
    startActivity(i);
    finish();
}

これはブラウザに依存する問題なのでしょうか?対策が解らずに困っています。
よろしくお願いします。

回答

SC-04Dに搭載されているブラウザもChromeですか?

仕組み的には一旦リダイレクトされるので、そこで閉じられたと扱われてセッションクッキーが捨てられている可能性はあると思います。

可能なら index.jspの以下のリンクを新しいタブで開いてあげればセッションが持続してうまくいくかもしれません。

<tag:notloggedin>
  <a href="signin">Sign in with Facebook</a>
</tag:notloggedin>

あとはOperaなりFireFoxなり他のブラウザで実行してみて動くかどうかでしょうね。

編集 履歴 (0)
  • ありがとうございます。
    どうもクッキーが捨てられているらしく、セッションIDが変わるのはどうしようもないようでした。
    Facebook インスタンスは再度生成する事で対処しました。
    ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。