FaceBook 應用程式開發 外部網站的共通會員驗證 Oauth2.0

FaceBook在最近這幾年已經採用Oauth2.0的認證方式了,這個方式可以讓其他外部網站也能存取使用者的資料,讓使用者可以減少會員註冊的手續,只要有一個FB的帳號就可以通行很多地方,他的概念跟多年前的OpenID很像,只是他很剛好的不在OpenID的清單中。

在開始實作之前,我們必須要先取得FaceBook的應用程式帳號,這個部份我在前一篇文章有介紹過,就不再說明了。
接下來的部分都是在我們自己的網站上面要建立的程式碼,需要注意的是,因為FB在驗證的時候會跟網域有關,因此無法在本機上面使用。
1.設定必備的變數
 $app_id = "應用程式ID/API 鑰匙";
 $app_secret = "應用程式密鑰";
 $my_url = "API返回的網址";
其中上面提到的app_id和app_secrect請在開發者工具的應用程式中尋找,詳情請見上篇FaceBook 應用程式開發 - 建立FB應用程式 2.驗證登入狀態和送出驗證
   session_start();
   $code = $_REQUEST["code"];

   if(empty($code)) {
     $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
     $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
       . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
       . $_SESSION['state'].'&scope=user_birthday,email';

     echo("<script> top.location.href='" . $dialog_url . "'</script>");
   }
這一段的作用其實簡單的說就是判斷是不是需要去問FB你的權限,如果REQUEST中是沒有code這個參數的,那麼畫面上面會直接彈出來請你去做授權驗證。而$dialog_url就是oauth的驗證API網址和參數。
其中:state這個參數是安全碼,是由我們這一端產生的鑰匙,API處理後也會回傳一模一樣的值,在這個範例中,我們只需要把產生的值存入SESSION中再等待回傳後比對就可以稍微提高安全性。
重要的是scope這個參數,關係到我們需要得到授權的權限資料,通常我需要生日和email這中間請用半形逗點分隔。詳細的參數表在這邊可以查到。 3.驗證state以及取得token解析會員資料內容
if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['state'])) {
     $token_url = "https://graph.facebook.com/oauth/access_token?"
       . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
       . "&client_secret=" . $app_secret . "&code=" . $code;

     $response = file_get_contents($token_url);
     $params = null;
     parse_str($response, $params);

     $graph_url = "https://graph.facebook.com/me?access_token=" 
       . $params['access_token'];

     $user = json_decode(file_get_contents($graph_url));
     print_r($user);
   }
   else {
     echo("The state does not match. You may be a victim of CSRF.");
   }
在API交換的過程中token是很重要的鑰匙,通常表示單次性可以使用這個API的通關護照。因此我們在$token_url中就是要來取得token然後將token送交到$graph_url取得FaceBook會員資料。其實這邊我們已經拿到資料了,接下來就是等著你把資料解析以及儲存使用摟



相關資料:

留言

這個網誌中的熱門文章

解決PHP JSON 中文亂碼的問題

PHPExcel 用PHP匯出成EXCEL

讓 PHP 接收 post 的 json 資料