使用PHP进行Facebook认证

面对频繁的Facebook认证问题,最大的困扰是即便搜索,也出现了很多语言、版本和环境不同的文章,无法找到详细解决方案。这种情况下最好的做法是购买一本书并全部抄写下来,但是甚至连这样的资料都找不到。

我会写一个PHP文件来从放置有登录按钮的页面重定向。请根据分支条件来调整是否需要登录才能进入。


session_start(); //サーバ側で保存する情報$_SESSIONを使用します宣言

if(empty($_GET[code])){ //初めてこのページに来た人は?code=が空なので以下の処理を実行
 $_SESSION[state] = sha1(uniqid(mt_rand(), true)); //乱数な接頭辞を付けたユニークIDをハッシュ化して予測不能な値を作る
 $params = array(
  client_id => FacebookアプリID,
  redirect_uri=> http://xxx.com/redirect.php, //このファイルの場所
  state => $_SESSION[state], //sessionにも入れた予測不能な値を入れる
  scope => public_profile,user_friends,email //Facebookから取得したいもの、申請しないで取得できるのは左記3つ
 );
 $url = "https://www.facebook.com/dialog/oauth?".http_build_query($params); //このあとぶっとぶAPIのURL準備
 header(Location: .$url); //飛ぶ
 exit; //飛ばした場合はここで終了。戻ってきたときは?code=が空でないのでelseに分岐する
}
else{ //$_GET[‘code’]が空ではない場合
 if($_SESSION[state] != $_GET[state]){
 echo "不正アクセスの可能性があるので終了"
exit;
}
$params = array(
client_id => FacebookアプリID,
client_secret => FacebookアプリSecret,
code => $_GET[code], //戻ってきたコード
redirect_uri => http://xxx.com/redirect.php //このファイルの場所
);
$url = https://graph.facebook.com/oauth/access_token?.http_build_query($params); //apiのurlにparamsをくっつけて渡す
$body = file_get_contents($url); // access_token=xxxx みたいに返ってくる
parse_str($body); //パースして$access_tokenつくる
$url = https://graph.facebook.com/me?access_token=.$access_token.&fields=name,picture,email; //トークンを渡して、名前、プロフィール画像、メアドを取得
$me = json_decode(file_get_contents($url)); //jsonで返ってくるのでデコード

try { //データベースに接続(DB事前準備は割愛)
 $dbh = new PDO(mysql:host=localhost;dbname=データベース名,ユーザー名,パスワード);
} catch(PDOException $e){
 echo $e->getMessage();
 exit;
}
//新規ユーザーかどうかFBIDを使って確認
$stmt = $dbh ->prepare("select * from users where facebook_user_id=:user_id limit 1");
$stmt->execute(array(":user_id"=>$me->id));
$user = $stmt->fetch();

if(empty($user)){ //新規ユーザーなら登録
 $stmt = $dbh->prepare("insert into users (facebook_user_id, facebook_name, facebook_picture, facebook_access_token, created, modified, facebook_email) values (:user_id, :name, :picture, :access_token, now(), now(), :email);");
 $params = array(
 ":user_id"=>$me->id,
 ":name"=>$me->name,
 ":picture"=>$me->picture->data->url,
 ":access_token"=>$access_token,
 ":email"=>$me->email
);
$stmt->execute($params);
$stmt = $dbh->prepare("select * from users where id=:last_insert_id limit 1");
$stmt->execute(array(":last_insert_id"=>$dbh->lastInsertId())); //最後に挿入されたIDのユーザー名
$user = $stmt->fetch();
}
if(!empty($user)){ //ちゃんと登録済を確認できたor新規登録できた場合
 session_regenerate_id(true); //元々のsessionを消して新しく生成
 $_SESSION[user] = $user;
 header(Location: 戻したいページ);
}

bannerAds