認可が必要なリクエストで、それを得ずにリクエストすると、
{
"error": {
"message": "An access token is required to request this resource.",
"type": "OAuthException",
"code": 104
}
}
のようなレスポンスが、HTTPステータスの[400 Bad Request]で返されます。このときはユーザーの認可を得て、アクセストークンを取得する必要があります。
Facebook Developersで「Create New App」をクリックします。

アカウントの認証を得ていないと、ここでそれを促す表示ができます。

Facebook APIを利用するには、アカウントの認証を得る必要があります。それには携帯電話による方法とクレジットカードによる方法の2つがあります。
携帯電話で認証する場合には、Confirm Your Phoneで携帯のメールアドレスを入力します。

そしてそのアドレス宛に送信されてくる認証コードを、認証画面で入力します。

クレジットカードで認証する方法は、Payments Settingsにあります。

App Name (アプリケーションの名前) を入力し、[Continue]をクリックします。

登録が成功すると、ユーザーによるアプリケーションの認可に必要なApp IDとApp Secretが取得できます。

WebサイトのURLが設定されていないと、
API Error Code: 191 API Error Description: The specified URL is not owned by the application Error Message: Invalid redirect_uri: Given URL is not allowed by the Application configuration.
のようにエラーが返されることがあります。このときはアプリケーションの管理ページのSettingsを開き、[Edit Settings]をクリックします。そして「Website with Facebook Login」の「Site URL」で、アプリケーションの置かれているWebサイトのURLを登録します。なおこのURLにパスは不要で、ドメイン名までで十分です。たとえばhttp://example.com/とします。

アプリケーションの管理ページで対象のアプリケーションを選択し、[Edit App]をクリックします。そしてページ左の[Related links]の一覧に表示されている[Delete App]をクリックします。

アプリケーションの登録により得られるアプリケーションIDを使用して、次のURLで示す認可ページ (OAuth Dialog) を表示させます。
https://www.facebook.com/dialog/oauth
?client_id=APP_ID
&redirect_uri=REDIRECT_URL
OAuth Dialogは、

のように表示されます。追加の権限が必要なときには、このURLにscopeパラメータを追加します。
ユーザーによりアプリケーションが認可された場合には、アクセストークンの取得に必要なコードをURLパラメータに含めて、OAuth Dialogへのアクセス時に指定したURLにリダイレクトされてきます。
認可に失敗し、次のような画面が表示された場合には、

[OK]をクリックした後に表示されるリダイレクト先のURLに、エラーコードとエラー文字列が含まれています。たとえば、
http://localhost/
?error_code=1
&error_msg=kError+1349040%3A+%E7%84%A1%E5%8A%B9%E3%81%AA%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3ID%3A+%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3ID%E3%81%8C%E7%84%A1%E5%8A%B9%E3%81%A7%E3%81%99%E3%80%82#_=_
では、
| error_code | 1 |
| error_msg | kError 1349040: 無効なアプリケーションID: 指定されたアプリケーションIDが無効です。(Invalid Application ID: The provided Application ID is invalid.) |
とエラーが説明されています。なお「kError 1349040」が発生した場合には、「Sandbox Mode」を無効にすることでこの問題を回避できます。
アクセストークンを付加して、次のURLへリクエストを送ります。
https://www.facebook.com/logout.php
?next=YOUR_REDIRECT_URL
&access_token=USER_ACCESS_TOKEN
YOUR_REDIRECT_URLで指定するURLは、アプリケーションの登録で指定したSite URLと同一のドメインである必要があります。
試したところ、この方法ではログアウトできませんでした。
OAuth Dialogからリダイレクトされてきたcodeパラメータを使用して、次のURLにリクエストを送ります。
https://graph.facebook.com/oauth/access_token
?client_id=YOUR_APP_ID
&redirect_uri=YOUR_REDIRECT_URI
&client_secret=YOUR_APP_SECRET
&code=CODE_GENERATED_BY_FACEBOOK
成功した場合には、
access_token=USER_ACCESS_TOKEN&expires=NUMBER_OF_SECONDS_UNTIL_TOKEN_EXPIRES
の形式のテキストで返されます。失敗のときには「false」とだけ返されます。
有効期限が過ぎたアクセストークンを利用すると、
{
"error": {
"message": "Error validating access token: Session has expired at unix time XX. The current unix time is YY.",
"type": "OAuthException",
"code": 190,
"error_subcode": 463
}
}
のようにレスポンスが[400 Bad Request]で返されます。
$app_id = "YOUR_APP_ID";
$app_secret = "YOUR_APP_SECRET";
$ridirect_url = "YOUR_URL";
if( ! isset( $_GET[ 'code' ] ) )
{
// Login
$params = array(
'client_id'=>$app_id,
'redirect_uri'=>$ridirect_url
);
$loginUrl = 'http://www.facebook.com/dialog/oauth?'.http_build_query( $params );
echo "<a href='{loginUrl}'>Login</a>";
}
else
{
$code = $_GET[ 'code' ];
// アクセストークンの取得
$params = array(
'client_id'=>$app_id,
'redirect_uri'=>$ridirect_url,
'client_secret'=>$app_secret,
'code'=>$code
);
$token_url = 'https://graph.facebook.com/oauth/access_token?'.http_build_query( $params );
$response = file_get_contents( $token_url );
parse_str( $response, $arr );
$access_token = $arr[ 'access_token' ];
// ユーザー情報の取得
$params = array( 'access_token'=>$access_token );
$graph_url = 'https://graph.facebook.com/me?'.http_build_query( $params );
$response = file_get_contents( $graph_url );
$user = json_decode( $response );
echo( 'Hello '.$user->name );
}
Server-Side Authentication | Facebook Developers
PHP SDKを使用すれば、認可の処理はより簡単に行えます。
ユーザーはApp Settingsで、個別のアプリケーションの認可を取り消せます。
