Facebook のユーザー認証と REST API (Graph API) の基本 (web アプリの場合)

Twitter の REST API を使うのと同じように FacebookAPI を使いたいけどドキュメントがよくわからない、と前に思って放置してたんですが、読書メーターFacebook 連携がうまくいかない原因を調べようと思って FacebookAPI を使ってみると意外と簡単だったのでメモしておきます。

Web サービスから FacebookAPI を使うことを想定しています。

まずはアプリケーションの登録

Facebook のアプリ管理アプリ https://developers.facebook.com/apps を使って自分のアプリを登録します。 「Create New App」 というボタンをクリックしてアプリの登録を行います。 アプリ登録の際には、開発者の承認のために携帯電話の番号かクレジットカード番号を登録しておく必要があります。

アプリの登録が終わると、アプリ用の App ID と App Secret が発行されます。

ユーザーごとのアクセストークンの取得

Twitter では OAuth 1.0a を用いてユーザー認証を行いますが、Facebook では OAuth 2.0 を用いてユーザー認証を行います。 その流れを簡単に説明します。 詳細は Facebook の開発者向けドキュメントを見てください。

1. ユーザーを Facebook ページに誘導し、自分のアプリを許可して貰う

ユーザーを

https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL
というページに誘導します。 これはアプリからユーザーの情報にアクセスすることを許可するかどうかをユーザーに尋ねるページです。 YOUR_APP_ID は自分のアプリの ID です。 YOUR_URL は、ユーザーがアプリを許可した後に遷移するページの URL です。 この URL のドメインは、アプリ登録時に web site の site url として記入しておかなければいけません。 (セキュリティ機能のため; 後から変更も出来る。)

また、ユーザーの情報にアクセスするだけでなく、ユーザーの wall への書き込みの許可などが必要な場合は、scope パラメータを追加してそれを指定します。 詳しくは公式のドキュメントを見てください。

2. ユーザーが許可すればリダイレクト

ユーザーがアプリを許可すると、YOUR_URL?code=A_CODE_GENERATED_BY_SERVER にリダイレクトされます。 このとき渡される A_CODE_GENERATED_BY_SERVER を使用して Facebook 側にアクセストークンの発行をリクエストします。

3. アクセストークンを取得

2. で取得した A_CODE_GENERATED_BY_SERVER を使って、

https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&client_secret=YOUR_APP_SECRET&code=A_CODE_GENERATED_BY_SERVER
に GET メソッドでリクエストを発行します。 YOUR_APP_IDYOUR_APP_SECRET は、アプリの登録をすることによって発行してもらえる値です。 YOUR_URL はなぜ必要なのかよくわかりませんが、とりあえず 1. で使用した値と同じ値でよいと思います。

エラーが発生しなければ、レスポンスとして以下のような文字列を得られます。

access_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&expires=6694

これでアクセストークンの取得が完了しました。 access_token パラメータの値がアクセストークンです。 これ以降はこのトークンを使うことで、アプリからユーザーの情報にアクセスしたり、(許可をしてもらっているならば) ユーザーの wall に投稿したりできるようになります。 expires は、このアクセストークンがいつまで有効かを表しています。 (特にユーザーに許可を求めなければ、アクセストークンは期限付きになる; 無期限のアクセストークンにするように最初にユーザーに許可を求めることも可能。)

Graph API を使用する

ユーザーの情報などにアクセスするためには Graph API というものを使用します。 詳細は公式のドキュメントを見てください。

この API にリクエストを投げる際に、パラメータとして access_token=XXXXXXX の形式でさきほど取得したアクセストークンを指定すると、そのアクセストークンを使用できます。

ユーザーの情報にアクセスする例

例えば、自分のユーザー ID を取得するための リクエストメソッドと URL は

GET - https://graph.facebook.com/me

ですので、アクセストークンのユーザーの ID を知りたい場合は

https://graph.facebook.com/me?access_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
という URL に GET メソッドでリクエストを投げればよいことになります。

また、wall に投稿するための API として

POST - https://graph.facebook.com/ID/feed
がありますので、ID が ID の人の wall にメッセージを投げる場合は
https://graph.facebook.com/ID/feed
という URL に
access_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&&message=HELLO
というメッセージボディを POST すればよいことになります。

アクセストークンの文字数

結局、読書メーターFacebook 連携がうまくいかないことがあった原因はアクセストークンの文字数を少なく見積もっていたことだったようです [ http://akahoshitakuya.com/archives/4026 ] が、Facebook のアクセストークンの文字数はユーザーによってまちまちのようですので、アクセストークンの文字数の上限がどうなっているのかの仕様を確認せずにアプリ内でのアクセストークンの文字数を制限することはしないようにしましょう。