「FacebookAPI」カテゴリーアーカイブ

【Facebook for PHP SDK】ログアウトの仕方

自分のFacebook連携アプリからログアウトするだけでなく、Facebookからもログアウトする方法です。
複数のFacebookアカウントを切り替えてテストしたりする場合に必要なんですが、なかなか正しいやり方を書いているものがなくて苦労しました。

$facebook->destroySession()を使うわけですが、Facebookログアウト後に呼び出すところがポイントです。

calePHPのサンプルコードですが、cakePHPでなくてもほとんど同じです。
getLogoutUrl()のnextパラメータにFacebookのセッションを破棄するページのURLを入れています。

参考:http://stackoverflow.com/questions/8405729/facebook-php-sdk-caching-user

facebookAPIでapi()を認証に使うとセッションが切れてしまう

たまにアプリからのfacebookログイン失敗してるけどなんなの

cakePHP(v2.2.2)にFacebook SDK for PHP(v.3.2.2)を入れてFacebookへのログインを実装しているのですが、1度目Facebookへのログインボタンを押してもログインせず、2回目押すとログインするという現象が起きましたので原因を調査しました。

問題のソースはこんな感じ。

Apacheのエラーログをみると

と記録されています。これはSDKの中にあるbase_facebook.phpの

によるものでした。stateがいつの間にか消失してしまったようです。stateは単純にSDKの中でログインURLを取得する際に

と生成するもので、セッションに入れておいてリクエストを受け取ったクライアントがリクエストを送ったクライアントと一致するかのチェックに使われています。このstateがどこで消えたのか追っていきました。

犯人はfacebook->api()

結果、Facebookへのログイン状態を確かめるfacebook->api()で消えていました。

facebook->api()を使うのはこことかの質問サイトでみつけたやり方で、facebook->getUserだとfacebookからログアウトした後もクッキーからログインし続ける、または逆にfacebookにログインしていてもユーザーIDがクッキーのために返ってこないことを回避するためにfacebook->api()を使うんだとか。(実際はfacebook->getUserで問題なかった)

facebook->api()のソースを追うと、OAuthで例外エラーがでたときにセッションを破棄しています。ここまで追っていったところで流れが追いきれなくなってきました・・・。

getLoinUrlの前にapi(‘me’)でログインチェックするのはやめよう

整理しますとfacebookでログイン状態、自分の作ったアプリでは未ログイン状態で画面を表示すると、アプリ認証がまだなのでfacebook->getLoginUrl()が実行され、stateがセッションに保存されます。このままログインすればいいのですが、問題の起きるパターンでは、ここで同じページを再度読み込みます。すると再度ログイン認証facebook->api()が行われ、セッションを破棄したうえでログインURLを生成するため、認証先でエラーとなるというわけです。

認証チェックはgetUserを使う、てかそれが普通だった

facebook->api()を使ってこの現象を回避する方法が思いつかなかったので、結局facebook->api()はやめてfacebook->getUser()を使うことにしました。テストしたところ、ちゃんとfacebookのログイン状態と連動した値を返していました。

そしてSDKのreadme.mdをみますと、ちゃんとfacebook->getUser()を使って0以外が返ってきたときだけapi(‘me’)を使うようになっているじゃありませんか。これみて作ってれば最初からこんなエラーはぶち当たらなかったはず・・・。

そんなわけで、普通はこのエラーには当たらないと思います。ただ解決までけっこう時間がかかってしまったのでドキュメントちゃんとみないとだめですよという教訓としてブログに載せてみました。