2014年3月1日土曜日

Facebook認証を動かす際の要注意的なお話(getUserが常に0を返してしまう問題)

  • このエントリーをはてなブックマークに追加

新サービスの開発にて、Facebook認証を用いるために色々とやっているわけだけれども、
an active access token must be used to query information about the current userが出てしまった。
以前書いたfacebook APIで「an active access token must be used to query information about the current user」が出てしまう原因の解決方法のものについてはもちろん解決してるんだけど、
また新たな問題が発生してしまった的な感じ。

ということで今回も諸々これらを解決するためにどうしたかということを書いていこうと思う。

■環境

・EC2 micro
・Route53
・Apache 2.4.6
・PHP 5.5.7
・fuelphp 1.7
・facebook SDK for PHP 3.2.3




■確認したこと

1:前の記事に書いたもの
2:リバースプロキシ
3:サーバーの設定


1:ドメインの違いとか色々

もちろんこれらは何も問題なし。
開発中のものだからサンドボックスでやってるけど自分だけだから大丈夫なわけで。


2:リバースプロキシ

リバースプロキシな設定のサーバーだとfacebook認証は動かないらしい。
参考URL

とはいってもそもそもリバースプロキシの設定していないしなぁって思ったけど、
とりあえず確認の意味も込めてnew Facebook($config)するときの設定を下記に変更。

$facebook = new Facebook(array(
  "appId" => "xxx",
  "secret" => "xxx",
  "trustForwarded" => true
));
$user = $facebook->getUser();
でもまぁ当然のようにgetUser()しても返ってくる値は0。
どうしたもんかと。


3:サーバーの設定

で、そもそも作り方間違ってないよね?と思って、hetemlにfuelphpなどを移して確認。
もちろんfuelphpのバージョンやらphp・apacheのバージョン違いやらなんやらはあるけどなんのその。
動かしてみたら問題なく動くので原因はサーバーの設定である事が判明。

なるべくセキュアな感じのサーバーにしたいなぁと思っていたので、サーバー作った際のメモを拝見。
Apacheは問題なさそうだけど、php.iniの設定で問題を発見。

//php.ini
session.cookie_secure = 1
ここを0にすると見事通った。
ちなみにこれはsession.cookie_secureは、 セキュアな接続を通じてのみCookieを送信できるかどうかということらしい。
つまりSSL環境下でないとダメだよということ。

今はテストということでSSLを通さず「http://〜〜〜」でやっていたから、
https://facebook.com→http://〜〜〜となってsessionというかcookieというかダメになって、
signed_requestが取得出来ずアクセストークンが取れないとか、getUser()が常に0になってしまったとのこと。


ということで原因としてはサーバーの作り方もあるということが判明。
もちろんsession.cookie_secure = 1であっても、SSL環境下ではちゃんと動作するので意外な盲点。

なので厳密な環境を構築するとかの場合は、
サーバーを作ってテストする際にもちゃんとSSLを通してやった方がいいよ的な。

Adsense