読者です 読者をやめる 読者になる 読者になる

log

日記です

php-sdkちょっと目を通した

調べ途中なんすけど、適当に書いときます。
Facebook php/sdkの話ししてます。

Facebook#getAccessTokenが返すtokenの種類が気分で違う件

php-sdkって、PHPのファイルが2つで作られているようで、それなら私でも読めるのでは、色々疑問があるのでソースコードを見たほうがいいのでは、と思い読みました。
#まぁ、本当はもっと軽い気持ちでなんとなく目を通すぐらいやるか、ぐらいの。
そしたら意外と読めたので疑問が解決しまくりました!
読んだ目的はgetAccessTokenの実装を見るためなので、それに関連するコードしか読んでないっす。

クラスの構成とか
  • Facebookクラスは、BaseFacebookという抽象クラスを継承しています。
  • getAccessTokenはBaseFacebookで定義されています。
Facebook#getAccessTokenの動き

見ているのは

  • getUserAccessToken
  • getApplicationAccessToken

動きは

  1. getApplicationAccessTokenを呼び、$this->accessTokenにセット
  2. getuserAccessTokenを呼び、返り値とれたら$this->accessTokenにセット
  3. 最後に$this->accessTokenをreturn

簡単に言うと、user access tokenがとれたらそれを返す、とれなければapplication access tokenを返す、というメソッドです。

protected function getUserAccessTokenの動き

  • signed_requestパラメータからoauth_tokenを取得
  • 取得に失敗した場合、他にもgetCodeとか色々しているようだが、よく分からない。
  • すべてに失敗した場合、Sessionにあるuser access tokenを取得しにいき、リターン。

protected function getApplicationAccessTokenの動き

BaseFacebookにprotectedなgetApplicationAccessTokenがいるんすけど、見てみると

  • return $this->appId.'|'.$this->appSecret;

な感じでappIdとappSecretを文字列結合しているだけでした。
これはDeveloperアカウントを持っていれば、OAuthとか関係なくローカルな情報だけで生成できるっすね。

読もうと思った理由はバグ直すためっす

ページタブでFacebookアプリを作っているのですが、iframe内で次のページに遷移した後にgetAccessTokenをコールした際にuser access tokenが取得できずにハマっていました。
理由はuser access tokenの元ネタとなるsignedRequestパラメータが取得できないため、でした。
なので、ページタブで初めに呼ばれるページでgetAccessTokenをコールし、Sessionに格納させて次回からはそれを参照してもらうようにしました。
トークンの有効期限切れでエラーが出る、という可能性はありますがiframeないでページ遷移するオペレーションで、それほど長くトークンを再取得しない、という状態になることはないと思っています。トークンの有効期限切れになった場合は、ページタブに一度遷移してもらえばOKです。
理想は、そういうexceptionが出た時に、user access tokenを再取得するメソッドを呼ぶべきですが、それを作るのが今は面倒くさいです追々作ります。
でもなんか結局、なにかエラーが出たらはじめの画面からやり直してね、的な感じにしました。