facebookのapiが変更になって、Graph APIを使ってユーザーの情報にアクセスする方法が変わった。offline_accessというパーミッションが指定できなくなり、常時ユーザー情報にアクセスすることができなくなった。これまではそのパーミッションを指定することで、一度アクセストークンを取得したらあとはいつでもユーザーにアクセスできたけど、数時間の有効期限が設定されて困った。
この有効期限ありのトークンは以下の状態で使用不可になる。
・有効期限を過ぎた ・ユーザーがアプリを削除した ・ユーザーがログアウトした ・ユーザーがパスワードを変更した
有効期限が1〜2時間て短すぎるし、ログアウトしたら使えなくなるなんてつらい。ではどうするかというとトークンの有効期限を60日に変更する。アプリの作成から有効期限を変更したトークンの取得について説明する。例として、ユーザーの投稿内容を取得してサイトに表示するというのをやってみる。
offline_accessパーミッション削除に対応する
Facebook Graph API での投稿(Post)にハマった件
Facebookアクセストークンを取得してそれを60日間使えるようにする
Authentication : Facebook開発者向けドキュメントの日本語訳とTips
facebookの開発者登録
Facebook開発者のページからアプリの作成をする。アプリ名やリダイレクト先のサイトURLなどを入力してアプリを作成。
有効期限が60日に変更されたアクセストークンを取得
続いて作成したアプリのAPP_IDとAPP_SECRETを差し替え。アクセストークンデバッガーを開いてDebugをクリック、表示されたUser TokenをコピーしてEXISTING_ACCESS_TOKENと差し替え。
以下の該当個所をそれぞれ変更する。
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
あとはこのURLにリクエスト(見やすく改行と空白を入れてるのでそれは消すこと!)すると有効期限が60日のトークンが表示される。実際はもっとトークン部分が長いけどこんな感じのレスポンスが返ってくる。
access_token=AAAD***&expires=5183896
access_token=と&expires=5183896の間に挟まれた部分が60日間使用できるトークン。めでたくユーザー情報にアクセスできる期間が延長された。
ユーザーの投稿を取得
アプリがデフォルトで取得できるユーザー情報はプロフィールとか基本的なものだけなので、そのままだと投稿内容やアップロードした写真などが取得できない。なので、アプリに必要な権限を与えるためにユーザーに認証してもらう。以下のAPP_IDを先ほどのアプリのものに差し替え、YOUR_URLをアプリ作成で入力したURLに差し替える。scopeには許可して欲しい項目を列挙する。取得可能な情報とscope一覧はこちらを参照。
https://www.facebook.com/dialog/oauth? client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=read_stream
必要なところを変更して↑を開くと認証用の確認画面が表示される。ここでユーザーがアプリを認証してくれればユーザー情報にアクセスできるようになる。これで準備はできたので、有効期限の延びたトークンを使って自分のfeedを取得する(↓は架空のトークンだから動かないよ)。
https://graph.facebook.com/me/feed?access_token=AAABsckKHaY4BAA8QZDZD
今は自分のフィードを取得したけど、URLのmeのところをアプリを認証してくれたユーザーのIDに変更すればそのユーザーの情報にアクセスできる。ここまで進めて思ったんだけど、このアクセストークンはユーザーごとに作るんではなくて、アプリの管理者が取得したものだからすべてのユーザーで共通のものを使うってことになるよね。それって何かよくない気がするんだけどどうなんだろう。ちなみにユーザーの情報を取得するには上記の手順になるけど、facebookページの内容を取得する場合はアプリのトークンがあればいいので、ユーザーの時のようなアプリの認証はしなくてもいい。
また、facebookページの場合はトークンの有効期限はないので一度の取得でずっと使える。