OAuthException: An active access token must be used to query information about the current user

Facebook PHP SDK の話。

/me とかを user の access token じゃなくて アプリの access token とかで叩いちゃうと出るんだけど、そもそもその前に getUser() で user_id が 0 じゃないことを確認してから叩いても出ることがあったので調査してた。

  • signedRequest から getUser する → user_id だけ persistentData に入る
  • その後 API を一度も呼び出さないと accessToken は persistentData (session) に入らない
  • 次のページで、signedRequest が無い (つまり、GETで普通にページ遷移)、かつ、session から user_id がとれた、かつ、session から accessToken はとれない、かつ、cookie からもとれない(JS SDK 経由のやつ)場合、userAccessToken がとれない
  • こうなると getUser() のゼロチェックはすりぬけて /me を叩いてしまう

(いやそもそも↑の状況は結構発生させにくいんだけどたまにあるのよね)

Signed Request からデータ取得したときに User Access Token を session に入れればいいと思うんだけどなんでそうなってないんだっけ?>SDK

とりあえず override しちゃえとおもったけど Facebook::getUserAccessToken() は protected だったので hasUserAccessToken() をつくってチェックできるようにした。