FaceBook在最近這幾年已經採用Oauth2.0的認證方式了,這個方式可以讓其他外部網站也能存取使用者的資料,讓使用者可以減少會員註冊的手續,只要有一個FB的帳號就可以通行很多地方,他的概念跟多年前的OpenID很像,只是他很剛好的不在OpenID的清單中。
在開始實作之前,我們必須要先取得FaceBook的應用程式帳號,這個部份我在前一篇文章有介紹過,就不再說明了。
接下來的部分都是在我們自己的網站上面要建立的程式碼,需要注意的是,因為FB在驗證的時候會跟網域有關,因此無法在本機上面使用。
1.設定必備的變數
其中上面提到的app_id和app_secrect請在開發者工具的應用程式中尋找,詳情請見上篇FaceBook 應用程式開發 - 建立FB應用程式
2.驗證登入狀態和送出驗證
這一段的作用其實簡單的說就是判斷是不是需要去問FB你的權限,如果REQUEST中是沒有code這個參數的,那麼畫面上面會直接彈出來請你去做授權驗證。而$dialog_url就是oauth的驗證API網址和參數。
其中:state這個參數是安全碼,是由我們這一端產生的鑰匙,API處理後也會回傳一模一樣的值,在這個範例中,我們只需要把產生的值存入SESSION中再等待回傳後比對就可以稍微提高安全性。
重要的是scope這個參數,關係到我們需要得到授權的權限資料,通常我需要生日和email這中間請用半形逗點分隔。詳細的參數表在這邊可以查到。 3.驗證state以及取得token解析會員資料內容
在API交換的過程中token是很重要的鑰匙,通常表示單次性可以使用這個API的通關護照。因此我們在$token_url中就是要來取得token然後將token送交到$graph_url取得FaceBook會員資料。其實這邊我們已經拿到資料了,接下來就是等著你把資料解析以及儲存使用摟
相關資料:
在開始實作之前,我們必須要先取得FaceBook的應用程式帳號,這個部份我在前一篇文章有介紹過,就不再說明了。
接下來的部分都是在我們自己的網站上面要建立的程式碼,需要注意的是,因為FB在驗證的時候會跟網域有關,因此無法在本機上面使用。
1.設定必備的變數
$app_id = "應用程式ID/API 鑰匙"; $app_secret = "應用程式密鑰"; $my_url = "API返回的網址";
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>"); }
其中: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."); }
相關資料:
留言