アクセストークンを取得する (User Login Server-side Flow)

Facebookの認証後に発行されるアクセストークンを取得するには、複数の方法があります。
(いずれもOAuthの仕組みが使われています)

「User Login Server-side Flow」は、

  1. サーバーサイドからGraph APIをコールする。
  2. Facebookのアカウントで認証を行う。
  3. 認証後にアクセストークンが発行される。
フローでアクセストークン取得を行います。

アクセストークン取得の流れ

  1. Graph API "https://www.facebook.com/dialog/oauth" に、GETパラメータを付加してコールする。
    <?php
    
    ////////// ↓ 解説を参照 //////////
    
    // 【client_id】を参照
    $client_id = '...';
    // 【redirect_uri】を参照
    $redirect_uri = '...';
    
    ////////// ↑ 解説を参照 //////////
    
    
    // Graph APIをコール
    header('Location: https://graph.facebook.com/oauth/authorize'
                   . '?client_id=' . $client_id
                   . '&redirect_uri=' . urlencode($redirect_uri));
    
    ?>
    

    解説

    【client_id】

    FacebookアプリのアプリケーションID(App ID/API Key)を指定。 確認方法

    【redirect_uri】

    Facebookの認証後のリダイレクト先URLを指定。
    リダイレクト先でアクセストークンの取得を行う。
    指定するURLはFacebookアプリの設定の、 「サイトURL」で設定したURLに含まれるパスであること。

    例:
    サイトURLに
    "http://www.example.com/facebook/"
    を設定している場合、リダイレクト先に指定できるURLは
    "http://www.example.com/facebook/authorize.php"
    等になる。

    サイトURLの確認・設定方法

    ※この他にオプションのパラメータがあるが、詳細は後述のオプションパラメータを参照。

  2. Facebook未ログインの場合、ログイン画面が表示されるのでログインを行う。

    画像クリックで拡大

  3. (対象のアプリが未設定であった場合は、ログイン後に以下のような画面が表示される)

    画像クリックで拡大

    パーミッションを指定している場合)

    画像クリックで拡大

  4. リダイレクトURLにcode (authorization code)が付加されてくるので取得する。

    それらをパラメータとして
    "https://graph.facebook.com/oauth/access_token"
    に付加してアクセストークン取得用のURLを生成、コールする。

    "access_token=...(&expires=...)"
    のような形でアクセストークンを取得することができる。
    ※ "expires" はアクセストークンの有効な時間(秒)。
    <?php
    
    ////////// ↓ 解説を参照 //////////
    
    // 【code】を参照
    $code = $_REQUEST['code'];
    // 【client_id】を参照
    $client_id = '...';
    // 【client_secret】を参照
    $client_secret = '...';
    // 【redirect_uri】を参照
    $redirect_uri = '...';
    
    ////////// ↑ 解説を参照 //////////
    
    
    // アクセストークン取得用のURLを生成
    $token_url = 'https://graph.facebook.com/oauth/access_token' 
               . '?client_id=' . $client_id
               . '&redirect_uri=' . urlencode($redirect_uri) 
               . '&client_secret=' . $client_secret
               . '&code=' . $code;
    
    // アクセストークン取得
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $token_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $token = curl_exec($ch);
    
    // アクセストークンを表示
    echo $token;
    
    ?>
    

    解説

    【code】
    リダイレクトURLにが付加されてくるauthorization code。
    【client_id】

    FacebookアプリのアプリケーションID(App ID/API Key)を指定。 確認方法

    【client_secret】

    Facebookアプリのシークレットキー(アプリの秘訣)を指定。 確認方法

    【redirect_uri】

    Facebookの認証後のリダイレクト先URLを指定。
    リダイレクト先でアクセストークンの取得を行う。
    指定するURLはFacebookアプリの設定の、 「サイトURL」で設定したURLに含まれるパスであること。

    例:
    サイトURLに
    "http://www.example.com/facebook/"
    を設定している場合、リダイレクト先に指定できるURLは
    "http://www.example.com/facebook/authorize.php"
    等になる。

    サイトURLの確認・設定方法

    ※この他にオプションのパラメータがあるが、詳細は後述のオプションパラメータを参照。

オプションパラメータ

アクセストークンの取得処理では、いくつかのオプションを指定することができる。
最初にコールするGraph API "https://www.facebook.com/dialog/oauth" に、以下のようなパラメータをオプションとして付加する。

<?php

// ※「アクセストークン取得までの流れ」での解説を参照
$client_id = '...'; // 【client_id】
$redirect_uri = '...'; // 【redirect_uri】


////////// ↓ 解説を参照 //////////

// 【scope】を参照
$scope = 'publish_stream,read_stream';
// 【display】を参照
$display = 'popup';
// 【state】を参照
$_SESSION['state'] = md5(uniqid(rand(), TRUE));

/////////// ↑ 解説を参照 //////////


header('Location: https://graph.facebook.com/oauth/authorize'
               . '?client_id=' . $client_id
               . '&redirect_uri=' . urlencode($redirect_uri)
               . '&scope=' . $scope
               . '&display=' . $display
               . '&state=' . $_SESSION['state']);

?>

解説

【scope】

Facebookアプリに付与する権限を指定。
付与可能な権限の一覧は下記を参照。
Facebook Developeres - Permissions - Extended Permissions

例:

  • read_stream : ニュースフィードへのアクセス権限。
  • publish_stream : 自身の名前でのFacebook投稿権限。
  • offline_access : 常時情報アクセス権限。

複数の権限を「read_stream,offline_access」のように、カンマ区切りで指定することが可能。

【display】

ログイン画面の表示方法を指定。 表示方法の一覧は下記を参照。
Facebook Developeres - Dialogs Overview - Display Modes

例:

  • page : PCのWebブラウザでログイン画面を表示させる場合に使用(デフォルト)。
  • popup : Webページのポップアップで表示させるような場合に使用。

【state】

CSRF対策等で使用。GETで付加したものと同じ値が、リダイレクト先のURLに付加される。

サンプルコード

<?php

session_start();

// ※「アクセストークン取得までの流れ」での解説を参照
$client_id = '...'; // 【client_id】
$client_secret = '...'; // 【client_secret】
$redirect_uri = '...'; // 【redirect_uri】

$code = $_REQUEST['code'];
$error = $_REQUEST['error'];
$error_reason = $_REQUEST['error_reason'];
$error_description = $_REQUEST['error_description'];

if (empty($code) && empty($error)) {

    // Facebook認証後のリダイレクトによるアクセスではない場合
    // (= GETパラメータに "code" または "error" がない場合)
    
    // CSRF protection
    $_SESSION['state'] = md5(uniqid(rand(), TRUE));
        
    // Facebook認証に遷移
    // 例;
    // Facebook未ログインの場合 → Facebookログイン画面を表示
    // Facebookログイン済 + アプリを許可済の場合
    // → "redirect_uri" に指定したURLに、GETパラメータ "code" 付きで
    // リダイレクトされる
    header('Location: https://graph.facebook.com/oauth/authorize'
                   . '?client_id=' . $client_id
                   . '&redirect_uri=' . urlencode($redirect_uri)
                   . '&scope=publish_stream,read_stream'
                   . '&display=popup'
                   . '&state=' . $_SESSION['state']);
} else {
    
    // Facebook認証後のリダイレクトによるアクセスの場合
    
    if (!empty($code)) {
        
        // Facebook認証成功の場合
        
        // "redirect_uri" に指定したURLに、
        // GETパラメータ "code" が付加されてリダイレクトされる
        if($_REQUEST['state'] == $_SESSION['state']) { // CSRF protection
            
            // アクセストークン取得用のURL生成
            $token_url = 'https://graph.facebook.com/oauth/access_token' 
                       . '?client_id=' . $client_id
                       . '&redirect_uri=' . urlencode($redirect_uri) 
                       . '&client_secret=' . $client_secret 
                       . '&code=' . $code;
            
            // アクセストークン取得
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $token_url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $token = curl_exec($ch);
            
            // アクセストークンを表示
            echo $token;
        }
        
    } else if (!empty($error)) {
        
        // アクセス拒否の場合
        
        // Facebookアプリのインストール / 権限許可の画面で
        // "キャンセル" ボタンを押す等した場合、
        // "redirect_uri" に指定したURLにGETパラメータ 
        // "error" "error_reason" "error_description"
        // が付加されてリダイレクトされる
        echo 'error:' . $error 
          . '/error_reason:' . $error_reason 
          . '/error_description:' . $error_description;
    }
}

?>

参考サイト