php-sdkちょっと目を通した
調べ途中なんすけど、適当に書いときます。
Facebook php/sdkの話ししてます。
Facebook#getAccessTokenが返すtokenの種類が気分で違う件
php-sdkって、PHPのファイルが2つで作られているようで、それなら私でも読めるのでは、色々疑問があるのでソースコードを見たほうがいいのでは、と思い読みました。
#まぁ、本当はもっと軽い気持ちでなんとなく目を通すぐらいやるか、ぐらいの。
そしたら意外と読めたので疑問が解決しまくりました!
読んだ目的はgetAccessTokenの実装を見るためなので、それに関連するコードしか読んでないっす。
クラスの構成とか
- Facebookクラスは、BaseFacebookという抽象クラスを継承しています。
- getAccessTokenはBaseFacebookで定義されています。
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を再取得するメソッドを呼ぶべきですが、それを作るのが今は面倒くさいです追々作ります。
でもなんか結局、なにかエラーが出たらはじめの画面からやり直してね、的な感じにしました。