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を追加しておきます。
関連記事
- PHPでfacebook投稿時に公開範囲を指定する方法
- PHPで複数の画像をfacebookに投稿する方法
- PHPでfacebookのフィード(ウォール)に投稿する方法
- facebook APIを使用する時にfacebook Appsでアプリを登録するまでの流れ
- PHP
- サンプルコード
- 数字(0〜9)のみかどうかを調べる正しい方法
- fgetcsv関数を文字化け対応 setlocaleの文字コード指定
- PHPをコマンドラインから使用する方法
- 『サイトが移動しました』を出さない方法
- PukiWiki
- ファイルダウンロード時のファイル名が文字化けする対処法
- cronのメール送信先を指定する方法(cronごとに送信先のメールアドレスを指定する方法)
- fsockopenでSSLサーバに接続する
- OpenPNEのツッコミどころ
- より高速に、推測困難な一意なIDを生成する方法
- ファイルを読み込む/ファイルに書き込む
- stdClassクラスとは
- php.ini が見つからない時
- mailtoの使い方
- SQL Buddy ブラウザベースのMySQL管理ツール
- リクエストヘッダーやリクエストボディーなどを取得する方法
- eGroupWare [バグ追跡システム]
- MediaWiki
- CakePHP
- Fatal error: Call to undefined function imagecreatefromjpeg() の対処法
- Joomla(ジュームラ)
- Mantis(マンティス) バグ管理システム
- Zend Serverとは
- PHPのインストール
- 『このインターネットのサイトを開くことができません。』と出て、ファイルをダウンロードできない
- 位置情報・GPS情報の取得方法
スポンサーリンク