幫我們的粉絲專頁按個讚!
本篇文章將教您如何在網頁新增 Facebook 登入功能!
PS:Facebook 新規定要求網頁網址必須要是 https,並且強制開啟對重新導向 URI 使用 Strict 模式,隱私政策網址也必須新增。
在開始教學前我們必須先在 Facebook for Developers 新增一個應用程式 (點我)
進入到頁面後點擊 Add a New App
接下來輸入資料,並按下建立應用程式編號
接著會自動進入到應用程式新增服務的頁面,找到 Facebook 登入 並點擊設定
接下來直接看到側邊欄,點擊設定
進入設定頁面後基本上設定都不用動,只需要新增 有效的 OAuth 重新導向 URI
在 有效的 OAuth 重新導向 URI 設定中,需要填入登入頁面的完整網址,例如 https://example.com/login.php,如果有多個頁面必須新增多個網址
設定完成後記得按下右下的儲存變更
接下來前往基本資料設定,完成基本資料填寫
最後來到應用程式審查頁面,在是否發布那點擊開關
應用程式就發布了!
接下來進入程式碼教學
先在專案目錄新增一個 facebook_login 資料夾,然後下載 php-graph-sdk (本教學使用 5.6.2 版本,點此下載) (GitHub)
將下載的壓縮檔內的 src 資料夾解壓至 facebook_login 資料夾
在 facebook_login 資料夾內先新增 initialization.php,並輸入以下程式碼
<?php /* * 張文相 Zhang Wenxiang - 個人 Blog * https://blog.reh.tw/ */ if(!function_exists('hash_equals')) { function hash_equals($str1, $str2) { if(strlen($str1) != strlen($str2)) { return false; } else { $res = $str1 ^ $str2; $ret = 0; for($i = strlen($res) - 1; $i >= 0; $i--) { $ret |= ord($res[$i]); } return !$ret; } } } require_once dirname(__FILE__).'/src/Facebook/autoload.php'; $fb = new Facebook\Facebook([ 'app_id' => '<輸入您的應用程式編號>', 'app_secret' => '<輸入您的應用程式密鑰>', 'default_graph_version' => 'v2.10', ]); $helper = $fb->getRedirectLoginHelper(); $permissions = ['email']; try { if (isset($_SESSION['facebook_access_token'])) { $accessToken = $_SESSION['facebook_access_token']; } else { $accessToken = $helper->getAccessToken(); } } catch(Facebook\Exceptions\FacebookResponseException $e) { echo 'Graph returned an error: ' . $e->getMessage(); exit; } catch(Facebook\Exceptions\FacebookSDKException $e) { echo 'Facebook SDK returned an error: ' . $e->getMessage(); exit; } ?>
在程式碼特別標示的部分就是要設定的地方,應用程式編號和密鑰在剛剛的應用程式 > 基本資料頁面可以找到
接下來一樣在 facebook_login 資料夾,新增 statuslogin.php,並輸入以下程式碼
<?php /* * 張文相 Zhang Wenxiang - 個人 Blog * https://blog.reh.tw/ */ if (isset($_SESSION['facebook_access_token'])) { $fb->setDefaultAccessToken($_SESSION['facebook_access_token']); } else { $_SESSION['facebook_access_token'] = (string) $accessToken; $oAuth2Client = $fb->getOAuth2Client(); $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($_SESSION['facebook_access_token']); $_SESSION['facebook_access_token'] = (string) $longLivedAccessToken; $fb->setDefaultAccessToken($_SESSION['facebook_access_token']); } if (isset($_GET['code'])) { header('Location: ./'); } try { $profile_request = $fb->get('/me?fields=name,first_name,last_name,email,link,picture'); $profile = $profile_request->getGraphNode()->asArray(); } catch(Facebook\Exceptions\FacebookResponseException $e) { echo 'Graph returned an error: ' . $e->getMessage(); session_destroy(); header("Location: ./"); exit; } catch(Facebook\Exceptions\FacebookSDKException $e) { echo 'Facebook SDK returned an error: ' . $e->getMessage(); exit; } ?>
這檔案不必修改程式碼!
現在回到專案主目錄,新增 logout.php,並輸入以下程式碼
<?php /* * 張文相 Zhang Wenxiang - 個人 Blog * https://blog.reh.tw/ */ session_start(); @session_destroy(); if ($_GET['url'] != Null) { header('location: '.$_GET['url']); } else { header('location: /'); } ?>
session_destroy();
是刪除 session,就可以登出
header('location: '.$_GET['url']);
是登出後轉址到原登出網址,在登出網址會帶 url 的參數
接下來就是重點了,以下為驗證是否登入的基礎架構程式碼
<?php session_start(); require_once dirname(__FILE__) . '/facebook_login/initialization.php'; //引入 Facebook 登入初始設定 if (isset($accessToken)) { require_once dirname(__FILE__) . '/facebook_login/statuslogin.php'; //已登入 Facebook 執行的內容 } else { $url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; //取得目前頁面網址 $loginUrl = $helper->getLoginUrl($url, $permissions); //取得 Facebook 登入網址 //未登入 Facebook 執行的內容 } ?>
程式碼特別標示的部分是取得 Facebook 登入網址
我寫的範例如下
<?php /* * 張文相 Zhang Wenxiang - 個人 Blog * https://blog.reh.tw/ */ session_start(); require_once dirname(__FILE__).'/facebook_login/initialization.php'; //引入 Facebook 登入初始設定 ?> <html> <head> <title>Facebook 登入功能示範</title> </head> <body> <h1>Facebook 登入功能示範</h1> <h2>教學文章:<a href="https://blog.reh.tw/archives/366" target="_blank">https://blog.reh.tw/archives/366</a></h2> <hr> <?php if (isset($accessToken)) : require_once dirname(__FILE__) . '/facebook_login/statuslogin.php'; ?> <p>您好 <a href="<?php echo $profile["link"]; ?>" target="_blank"><?php echo $profile["first_name"]; ?></a>!</p> <br> <p>取得的資料陣列<br><?php print_r($profile); ?></p> <br> <p>全名:<font color="#883584"><?php echo $profile["name"]; ?></font> <br>名子:<font color="#883584"><?php echo $profile["first_name"]; ?></font> <br>姓氏:<font color="#883584"><?php echo $profile["last_name"]; ?></font> <br>Email:<font color="#883584"><?php echo $profile["email"]; ?></font> <br>Facebook 個人動態網址:<a href="<?php echo $profile["link"]; ?>" target="_blank"><?php echo $profile["link"]; ?></a> <br>大頭照圖片高度:<font color="#883584"><?php echo $profile["picture"]["height"]; ?></font> <br>大頭照圖片寬度:<font color="#883584"><?php echo $profile["picture"]["width"]; ?></font> <br>大頭照網址:<font color="#883584"><?php echo $profile["picture"]["url"]; ?></font> <br><img src="<?php echo $profile["picture"]["url"]; ?>"> <br>使用者 Facebook ID:<font color="#883584"><?php echo $profile["id"]; ?></font></p> <br> <h3><a href="logout.php?url=https://<?php echo $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?>">登出</a></h3> <?php else : ?> <?php $url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; //取得目前頁面網址 $loginUrl = $helper->getLoginUrl($url, $permissions); //取得 Facebook 登入網址 ?> <p><font color="#ff0000">您尚未登入 Facebook!</font></p> <h3><a href="<?php echo $loginUrl; ?>">使用 Facebook 登入</a></h3> <?php endif; ?> </body> </html>
說明一下,在程式碼第 33 行登出網址為 logout.php?url=https://<?php echo $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?>
,在 ?url= 後面的 <?php echo $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?>
就是取得目前頁面的網址,?url= 的 url 為參數,後面的 https://<?php echo $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?>
為值,會把這個值一起送到 logout.php 進行處理。
在已登入那區域可以寫入 print_r($profile);
來取得可讀取的資料陣列
Array ( [name] => 張文相 [first_name] => 文相 [last_name] => 張 [email] => p29022716@gmail.com [link] => https://www.facebook.com/app_scoped_user_id/1495505673878995/ [picture] => Array ( [height] => 50 [is_silhouette] => [url] => https://lookaside.facebook.com/platform/profilepic/?asid=1495505673878995&height=50&width=50&ext=1523716571&hash=AeS4DiOohOxZRJJX [width] => 50 ) [id] => 1495505673878995 )
以上為本人登入後 print_r($profile);
所輸出的陣列資料
如果要抓取使用者全名的話使用 echo $profile["name"];
,如果要抓取使用者大頭照網址的話使用 echo $profile["picture"]["url"];
,以此類推!
教學就到這邊為止,如果有任何問題歡迎在網頁下方 Facebook 留言板留言,我有看到的話會回覆的OUO
GitHub
https://github.com/GoneTone/php-login-demo-for-facebook
張文相 Wenxiang Zhang
我是本站的站長,是一位 Web 工程師,喜歡 Coding XDD
本站內容未經授權許可請勿擅自抄襲
如果需引用部分內容請註明來源網址
發表時間:2018/04/11 23:04:41
修改時間:2020/11/14 18:16:56