FacebookとOAuth2.0

http://d.hatena.ne.jp/bang_yy/20101103/1288799126によると、
Facebookはweb applicationを対象にしたFlow以外に

JavaScript-based authentication
Desktop application authentication
Mobile Web authentication
Canvas Applications (beta)
の4つのタイプをサポートしている。

web application flowに関して、
authZ endpointは、https://graph.facebook.com/oauth/authorize
(最新のFacebookのドキュメントによると、https://www.facebook.com/dialog/oauthのようだ)
token endpointは、https://graph.facebook.com/oauth/access_token
アクセストークン取得後のAPIリクエストの例は、https://graph.facebook.com/me?access_token=...

http://developers.facebook.com/docs/authentication/によると、Facebook Platformがサポートするユーザログイン用のフローは、server-side (OAuth2.0仕様では、authentication code flow )とclient-side (OAuth2.0仕様では、implicit flow)。どちらの場合にも、user authentication(ユーザが本人であることを確認)、app authorization(ユーザがアプリケーションに自分のデータを提供することを確認)、app authentication(ユーザ本人のデータを提供されていることをアプリケーションが確認)の3つのステップに従って、行われる。

Server-side Flowの場合、user authenticationとapp authorizationは、以下のURLに示されるOAuth Dialogにユーザがリダイレクトされることによって行われる。ここで、client_idは、Facebook Platformに登録したWebアプリケーションのID。redirect_uriは、ユーザが情報提供を承認または拒絶した後にリダイレクトされるURL。
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL

ユーザから基本情報以外のデータも提供してもらう必要があるときには、以下のようにscopeパラメータを指定する。
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=email,read_stream

ユーザが情報提供を拒絶した場合、以下のURLにリダイレクトする。
http://YOUR_URL?error_reason=user_denied&error=access_denied&error_description=The+user+denied+your+request

ユーザが情報提供を承認した場合、以下のようにauthorization codeが返される。
http://YOUR_URL?code=A_CODE_GENERATED_BY_SERVER

authorization codeを取得したら、以下のURLでアクセストークンを取得する。client_secretは、FacebookアプリケーションとFacebook Platformとの間の秘密であり、ユーザなど他の誰かには知らせないようにする。
https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

Client-side Flowの場合も、user authenticationとapp authorizationには、OAuth Dialogを使用するが、以下のように、response_typeパラメータにtokenという値をセットする点が異なる。scopeパラメータを追加できる点は、Server-side Flowのときと同じ。
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&response_type=token

ユーザが情報提供を承認した場合、authorization codeではなく、アクセストークンがデスクトップクライアントに直接返される。app authorizationは、YOUR_URLがFacebook Platformに登録したサイトのURLと合致するかを検証することによって行われる。
http://YOUR_URL#access_token=166942940015970%7C2.sa0&expires_in=64090

ユーザがApp Dashboardhttp://www.facebook.com/settings/?tab=applications)上で、アプリケーションへの情報提供を取りやめた場合、Developer App(http://www.facebook.com/developers/)内で設定したDeauthorize Callbackで指定したURLに対して、通知が行われる。

Facebook Platform では、User Loginに加えて、OAuth 2.0 Client Credential flowを利用したApp Loginをサポートしている。以下のように、Developer Appでアプリケーションを登録したときに生成されたIDと秘密を指定し、grant_typeパラメータにclient_credentialsを指定することで、Insights データの取得や、Requestの承認などの管理タスクを行うことができる。
https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&client_secret=YOUR_APP_SECRET&grant_type=client_credentials

取得したアクセストークンを用いて、下記のようにInsightsデータの取得などを行うことができる。
https://graph.facebook.com/YOUR_APP_ID/insights?access_token=TOKEN_FROM_ABOVE

アプリケーションからFacebookページの管理タスクを行うためには、管理者ユーザからmanage_pagesの許可を得る必要がある。
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=manage_pages&response_type=token
manage_pagesの許可があると、accountコネクションを取得することができ、そのユーザが管理しているページの一覧が各ページのアクセストークンとともに取得することができる。
https://graph.facebook.com/me/accounts?access_token=TOKEN_FROM_ABOVE