offline_accessパーミッション削除に対応する
既に各所で話題になっているとおり、Facebookアプリからの自動投稿などによく使われているoffline_accessパーミッションが7/5をもって完全に削除されます。
代替策として考えられる2つの方法について、PHPでの具体的な実装方法を見ていきたいと思います。
- Access Tokenの期限を60日に延長する
- アプリ自体のAccess Tokenを利用する
どちらを使えば良いのかは、それぞれ性質が違うものですので状況に応じて判断が必要です。
App Access Tokenでは、利用者がアプリの認証をしていれば無期限でウォール投稿等ができますので、多くのケースはこちらに当てはまるでしょう。
しかし、例えばグリーティングカードサービスのように、ウォール投稿したい場所がアプリ利用者の友達(つまり、アプリ認証をしていない人)の場合は、App Access Tokenでは投稿ができませんので、60日という期限付きながらユーザーとして投稿が可能なトークンを使うことになります。
Access Tokenの期限を60日に延長する
ユーザーの認証をする際に得られるAccess Tokenは、短時間で期限が切れてしまいます。
これを60日に延長するAPIが用意されましたので、Access Token取得時に60日に期限を延長しておくと良いでしょう。
詳しくは、Removal of offline_access permission – Facebook開発者(英語) に書かれています。
60日トークンを取得するには、
https://graph.facebook.com/oauth/access_token? client_id=APP_ID& client_secret=APP_SECRET& grant_type=fb_exchange_token& fb_exchange_token=EXISTING_ACCESS_TOKEN
にアクセスすれば良いので、実際には、以下のようなコードになります。
// 公式SDK読み込み require "facebook.php"; $facebook = new Facebook(array( "appId" => "YOUR_APP_ID", "secret" => "YOUR_APP_SECRET" )); $user = $facebook->getUser(); // 詳細認証プロセスは割愛します // SDKサンプルコードをご確認ください if ($user) { // 60日に延長 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&client_secret=YOUR_APP_SECRET&grant_type=fb_exchange_token&fb_exchange_token= EXISTING_ACCESS_TOKEN"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec( $ch ); curl_close($ch); // 60日Access Tokenを取得する $access_token = $facebook->getAccessToken(); }
なお、この60日トークンは、バッチなどでの自動延長は認められておらず、さらに延長する場合は必ずユーザーの意思をもって延長するための仕組みを提供し、上記コードの60日延長部分を再度コールするという手順となります。
アプリ自体のAccess Tokenを利用する
ウォールへの自動投稿などを行う場合、つまりバッチ処理などでpublish_streamを使いたいだけであれば、ユーザートークンではなく、アプリのAccess Tokenを利用することができます。
アプリのAccess Tokenは期限がありませんので、自動投稿だけであれば今までのオフラインアクセスと同様に利用することが可能です。
ただし、アプリのAccess Tokenは、App Typeがウェブの場合のみ利用が可能となることに注意が必要です。
詳細はAuthenticating as an App – Facebook開発者(英語) に記載されています。
以下のURLにアクセスすることで、App Access Tokenが得られますので、得られたアクセストークンをどこかに保存しておき、バッチ処理時などはこちらを使うようにします。
https://graph.facebook.com/oauth/access_token? client_id=YOUR_APP_ID &client_secret=YOUR_APP_SECRET &grant_type=client_credentials
上記方法が公式な方法ではありますが、Facebook公式のPHP SDKを見ていると以下のような記述がありました。
protected function getApplicationAccessToken() { return $this->appId.'|'.$this->appSecret; }
つまり、YOUR_APP_ID|YOUR_APP_SECRETをアプリケーション アクセストークンとして使っています。
試しにこの形式でウォールに投稿してみたところ問題無く投稿できました。
アプリのAccess Tokenを使う際は、ユーザーのAccessToken同様に $facebook->setAccessToken(YOUR_APP_ID|YOUR_APP_SECRET) を使います。
ただし、アプリケーションのtokenですのでユーザー情報を持っていませんので、例えばウォールに投稿する際に me という表現は使用できず必ずユーザーIDを指定して投稿する必要があります。
[…] http://t.co/wNAjA2jsXB @appofitさんから https://o-84.com/article/601/ アド企画 (adokikaku) 2013/03/31 […]