認可 (Authorization )

認可を得ずにリクエストした場合

認可が必要なリクエストで、それを得ずにリクエストすると、

{
   "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 IDApp Secretが取得できます。

Site URLの設定

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と同一のドメインである必要があります。

試したところ、この方法ではログアウトできませんでした。

アクセストークン (access token)

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」とだけ返されます。

アクセストークンの有効期限

  • long-lived user access_token … 60日
  • short-lived user access_token … 1~2時間

有効期限が過ぎたアクセストークンを利用すると、

{
   "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]で返されます。

参考

  • Handling Invalid and Expired Access Tokens - Facebook Developers

サンプルコード

$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で、個別のアプリケーションの認可を取り消せます。