PHPでのfacebookアプリの認証処理(APIを使うユーザー認証)

[参考記事] facebook APIを使用する時にfacebook Appsでアプリを登録するまでの流れ
[参考記事] PHPでfacebookのフィード(ウォール)に投稿する方法
[参考記事] PHPで複数の画像をfacebookに投稿する方法
[参考記事] PHPでfacebook投稿時に公開範囲を指定する方法

displayパラメータ
scopeパラメータ
認証成功時にFacebookクラスで保存されるセッション
アクセストークン(Access Token)
サンプルコード
アクセストークンの有効期限

facebookアプリを使うには、ユーザー側がアプリの認証をする必要があります。

facebookのAPI呼び出しをPHPで行うには、公式のPHP SDKを使うのがいいです。

Facebook for PHP SDK
https://developers.facebook.com/docs/reference/php/

facebook-php-sdk
https://github.com/facebook/facebook-php-sdk

https://github.com/facebook/facebook-php-sdk/tree/master/src
ここから次の3ファイルを取得します。
base_facebook.php
facebook.php
fb_ca_chain_bundle.crt

このfacebook.phpからbase_facebook.phpが呼び出され、 base_facebook.phpからfb_ca_chain_bundle.crtが呼び出されているので、読み込むのはfacebook.phpのみです。

require_once "facebook.php";

facebook.phpを読み込むと、Facebookクラスが使えます。

認証用ページのURLを取得するには、$facebook->getLoginUrl()を使います。

$facebook = new Facebook(array(
  'appId' => 【App ID】,
  'secret' => 【App Secret】
));
$params = array(
  'display' => 【facebook認証画面の表示形式】,
  'redirect_uri' => 【認証後の遷移ページ】,
  'scope' => 【許可を求める権限】,
);

$fb_login_url = $facebook->getLoginUrl($params);

生成されるURLは次のようになります。

https://www.facebook.com/dialog/oauth?client_id=【App ID】&redirect_uri=【認証後の遷移ページ】&state=【??】&display=【facebook認証画面の表示形式】&scope=【許可を求める権限】

displayパラメータ

page Display a full-page authorization screen (the default)
ページいっぱいの画面が表示されます。
facebookの画面を背景にして、中央に認証ダイアログが表示される形式です。
displayパラメータを指定しなければこの画面になります。
popup Display a compact dialog optimized for web popup windows
ポップアップ用の画面が表示されます。
画面全体に認証ダイアログが表示される形式です。
ポップアップで使用しなかった場合は、開発者アカウントのみ警告文言が出ます。
wap Display a WAP / mobile-optimized version of the dialog
携帯電話用の画面が表示されます。
touch Display an iPhone/Android/smartphone-optimized version of the dialog
iPhoneやAndroidなどのスマホ用の画面が表示されます。

scopeパラメータ

権限を複数指定するには、カンマでつなぎます。
例:publish_stream,read_stream,user_status

publish_actions Open Graphアクションの投稿
ユーザ自身のウォール(フィード)に投稿
ビデオ / 画像の投稿(アルバム作成を含む)
ビデオ / 画像へのタグ付け
フィードに対していいね! / コメント

投稿内容の説明が承認ダイアログで表示されない
publish_stream publish_actionsの全て
友だちのウォールに投稿
クエスチョンを投稿
ノートを投稿
イベント / グループに投稿

投稿内容の説明が承認ダイアログで表示される
status_update ステータス更新
manage_pages 管理しているファンページへのアクセス許可
offline_access オフラインでのアクセス許可

認証後の遷移ページのURLは、アプリ設定画面でサイトURLを登録しておかないとエラーになります。
登録したサイトURLと同じドメインである必要があります。


生成されたURLを開くと次のようなfacebookサイト側の承認画面が表示されます。

ログインしていなければ次の画面が出ます。

   ↓
scopeにpublish_streamを指定した場合

   ↓

   ↓
【認証後の遷移ページ】

認証が成功した場合、【認証後の遷移ページ】のURLにcodeパラメータとstateパラメータが付いたURLに遷移します。

http://www.example.com/return.php?code=...&state=...#_=_

失敗した場合は、【認証後の遷移ページ】のURLにerror_codeパラメータとerror_messageパラメータとstateパラメータが付いたURLに遷移します。

http://www.example.com/return.php?error_code=2&error_message=この機能は現在ご利用いただけません%3A リクエストの処理中にエラーが発生しました。しばらくしてからもう一度お試しください。&state=...#_=_

認証済みの場合は承認画面は出ずに、そのまま成功した場合と同じURLにリダイレクトします。

認証成功時にFacebookクラスで保存されるセッション

成功した場合、認証後のページでFacebook()クラスを呼び出すと、セッションにcode、access_token、user_idが書き込まれます。

fb_【App ID】_code
fb_【App ID】_access_token
fb_【App ID】_user_id


ここで気を付けなければいけないのが、書き込まれるセッションはfacebookサイトではなく自身のサイトであるということです。

つまりfacebookサイトでログアウトしても、自身のサイトではセッションは残ります。

このことでユーザーが戸惑う動作となる場合があります。

自身のサイトのセッション facebookサイトのセッション
--Aアカウント
アプリ認証
AアカウントAアカウント
facebookでログアウト
Aアカウント--
facebookで別アカウントでログイン
AアカウントBアカウント

このようにユーザーはBアカウントと思っていても、自身のサイトではAアカウントの動作をしてしまうことが考えられます。

自身のサイトに書き込まれているfacebookのセッションを破棄するには destroySession() を使います。

$facebook->destroySession();

認証に成功した場合、facebookアカウントのユーザーIDを取得するにはgetUser()を使います。

$uid = $facebook->getUser();

アクセストークン(Access Token)

アクセストークン(Access Token)を使うと、 認証ができたユーザーはセッションを取得するために、たびたびfacebookのURLに飛ばす必要はありません。

認証をしてfacebookセッションがある状態でgetAccessToken()を使うとアクセストークンを取得できます。

$access_token = $facebook->getAccessToken();

このアクセストークンをsetAccessToken()で指定すると、認証後のセッションと同じユーザー動作が行えます。

$facebook->setAccessToken($access_token);

特定のfacebookアカウントでの動作を行いたい時などに使えます。

サンプルコード

defined("FACEBOOK_APP_ID") || define("FACEBOOK_APP_ID", 【App ID】);
defined("FACEBOOK_SECRET") || define("FACEBOOK_SECRET", 【App Secret】);

$facebook = new Facebook(array(
  'appId' => FACEBOOK_APP_ID,
  'secret' => FACEBOOK_SECRET,
));
$uid = $facebook->getUser();

if(!empty($_GET['error_code'])){
  echo 'facebook認証エラー';
  exit;
}elseif(!$uid){
  $params = array(
    'redirect_uri' => "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["SCRIPT_NAME"],
    'scope' => 'publish_stream',
  );
  $fb_login_url = $facebook->getLoginUrl($params);
  header("Location: " . $fb_login_url);
  exit;
}

// 毎回、認証をさせたくないとか特定ユーザの動作をさせたい場合は
// アクセストークンを記録しておきます。
$access_token = $facebook->getAccessToken();

ここで認証後のURLを次のように指定しているサンプルコードを見ますが、あまりよくないです。

"http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]

この$_SERVER["REQUEST_URI"]にはGETクエリまで含まれるので、facebookサイトで付与されるクエリと重複するものが渡されるとおかしな動作になる可能性があります。

アクセストークンを使う場合

$facebook = new Facebook(array(
  'appId' => FACEBOOK_APP_ID,
  'secret' => FACEBOOK_SECRET,
));
$facebook->setAccessToken($access_token);

これでfacebookの認証済みの状態になります。

ただしユーザーがfacebookサイトでアプリの許可を削除してしまうことを考慮しなければいけません。

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

アクセストークンには有効期限があります。
有効期限が切れた場合やユーザーがfacebookのパスワードを変更するとアクセストークンは無効になります。

有効期限を無期限にするにはscopeにoffline_access permissionを追加しておきます。

関連記事

スポンサーリンク

cherry-pick

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る