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
- サンプルコード
- HTMLファイルのエンコードを『内容から判別する』にしない方法
- モザイク画像を作る方法
- Zend Serverとは
- cron実行時に『/bin/sh: 〜〜: command not found』と出てcronが実行されない場合
- SELECTタグで色を選択する場合のサンプル
- phpMyAdminでログイン画面を出さずにデータベースに接続する方法
- プログラムでもっとも正確に日本の祝日を求める方法(内閣府公表CSVの過去3度の改訂履歴)
- create_functionでメソッドを使用する方法
- 「ID」や「ID_xxxx」という文字列があるCSVファイルをExcelで開くとSYLKエラーが出る
- phpBugTracker [バグ追跡システム]
- キャリア・世代を判別する
- 『crontab -r』でcronの設定を間違って消してしまった場合の対処法
- コマンドやphpMyAdminで複数のデータベースに接続できるユーザーを作成する方法
- 位置情報・GPS情報の取得方法
- OpenTask [バグ追跡システム]
- cronを実行すると『TERM environment variable not set.』というエラーメールが飛ぶ
- 例外処理(Exception)
- VGA端末用に出力画像を拡大縮小する方法
- magic_quotes_gpc = On の対策
- JISコードでstrlenの文字数が合わない(目視の文字数とstrlenの文字数が異なる)
- PCやスマホがネットワーク内にあるかどうかを調べる(在宅かどうかの判断)
- mbstringエミュレータ
- 画像の保存やメール転送を制限する方法
- テキストを可逆的な暗号化する Crypt_Blowfish
- quoted-printable文字列の変換
- Excelで保存したときのCSVファイルの仕様
スポンサーリンク