最近,關於惰性註冊的爭論頗多。事實證明,使用者思考的越少,轉換率就越高!多好的想法啊!如果每個人似乎都有 Facebook 個人資料,為什麼不添加一鍵式用戶註冊呢?今天我將向您展示如何做到這一點。
讓我們先建立一個資料庫表。
CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `oauth_provider` varchar(10), `oauth_uid` text, `username` text, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
非常簡單:我們將設定一個使用者資訊表,其中包含 ID、使用者名稱、名字和姓氏、使用者圖片的 URL 以及註冊日期。此外,我們還添加了 oauth_provider
和 oauth_uid
字段,以區分不同的第三方開放身份驗證協定及其識別碼。例如,假設下週您認為讓 Twitter 用戶加入是個好主意。很簡單;您只需為 oauthprovider 設定另一個值,並避免重複 oauthuid 值。
讓我們先建立一個新應用程式。為其命名並同意條款和條件。接下來,在基本選項卡中取得API Key和Secret,如下所示。
在畫布選項卡上,將Canvas URL和授權後重定向URL#設定為您的本機主機和腳本將處理的路徑- 類似於http : //localhost.com/login_facebook.php?
。注意末尾的問號和網域;兩者都是 Facebook 所要求的。只需將您的 hosts
檔案設定為有效的網域即可。
在連線標籤上,將連線 URL 設定為相同的值,並將 localhost.com
(或您正在使用的)設為基本網域。
現在儲存,下載客戶端程式庫,並將src
dir中的facebook.php
解壓縮到根目錄中建立的新目錄。
身份驗證流程分為三個步驟:
我們在註冊登入之前先進行快速測試。
# We require the library require("facebook.php"); # Creating the facebook object $facebook = new Facebook(array( 'appId' => 'YOUR_APP_ID', 'secret' => 'YOUR_APP_SECRET', 'cookie' => true )); # Let's see if we have an active session $session = $facebook->getSession(); if(!empty($session)) { # Active session, let's try getting the user id (getUser()) and user info (api->('/me')) try{ $uid = $facebook->getUser(); $user = $facebook->api('/me'); } catch (Exception $e){} if(!empty($user)){ # User info ok? Let's print it (Here we will be adding the login and registering routines) print_r($user); } else { # For testing purposes, if there was an error, let's kill the script die("There was an error."); } } else { # There's no active session, let's generate one $login_url = $facebook->getLoginUrl(); header("Location: ".$login_url); }
現在,請訪問 http://localhost.com/login_facebook.php
,讓我們看看會發生什麼。如果您被重新導向到 Facebook 並請求許可,那麼我們就走在正確的軌道上。
但是,可能有兩個問題。第一個:如果您重新導向到 Facebook,但顯示錯誤,則設定中可能缺少值。返回您的應用程式設定並檢查“連接”和“畫布”選項卡,並確保這些欄位正常,如上所述。
可能還有另一個問題,您會看到錯誤,例如「Uncaught CurlException: 60: SSL 憑證問題,請驗證 CA 憑證是否正常。」發生這種情況是因為 CURL 設定。您必須開啟 facebook.php
,找到 makeRequest() 方法,然後在函數內找到此行:
$opts = self::$CURL_OPTS;
緊接在後,新增:
$opts[CURLOPT_SSL_VERIFYPEER] = false;
我討厭破解庫,但我還沒找到其他方法。好吧,讓我們繼續進行用戶註冊。我還添加了一個 try/catch 語句,因為如果 URL 中的 GET 參數中有舊的會話金鑰,腳本將會因可怕的錯誤而終止。
接下來我們將使用 MySQL。請注意,我不會實現資料清理程序,因為我希望程式碼盡可能簡短並能完成任務。請記住這一點:始終清理您的資料。
首先,讓我們連接到資料庫。
mysql_connect('localhost', 'YOUR_USERNAME', 'YOUR_PASSWORD'); mysql_select_db('YOUR_DATABASE');
現在,讓我們處理 $session
條件,以防我們有會話。
# We have an active session; let's check if we've already registered the user $query = mysql_query("SELECT * FROM users WHERE oauth_provider = 'facebook' AND oauth_uid = ". $user['id']); $result = mysql_fetch_array($query); # If not, let's add it to the database if(empty($result)){ $query = mysql_query("INSERT INTO users (oauth_provider, oauth_uid, username) VALUES ('facebook', {$user['id']}, '{$user['name']}')"); $query = msyql_query("SELECT * FROM users WHERE id = " . mysql_insert_id()); $result = mysql_fetch_array($query); }
請注意,我正在查詢資料庫,尋找facebook
作為oauth_provider
;如果您想接受其他OAuth 提供者(如twitter、Google 帳戶、Open ID 等)和oauth_uid
,這通常是一個好主意,因為它是提供者為其使用者帳戶提供的識別碼。
如果我們將 oauth_provider
欄位保留為 text
欄位類型,則可能會導致效能不佳。因此,最好的選擇是將其設為 ENUM 類型。
我們現在有一個 $result
var,其中包含從資料庫查詢的值。接下來讓我們添加一些會話。在腳本的開頭新增此行。
session_start();
在 empty($result)
條件之後,附加以下內容:
if(!empty($user)){ # ... if(empty($result)){ # ... } # let's set session values $_SESSION['id'] = $result['id']; $_SESSION['oauth_uid'] = $result['oauth_uid']; $_SESSION['oauth_provider'] = $result['oauth_provider']; $_SESSION['username'] = $result['username']; }
由于对已登录的用户进行身份验证没有什么意义,因此在 session_start()
行下方添加:
if(!empty($_SESSION)){ header("Location: home.php"); }
在需要身份验证的脚本中,只需添加:
session_start(); if(!empty($_SESSION)){ header("Location: login_facebook.php"); }
如果您想显示用户名,请将其作为数组访问。
echo 'Welcome ' . $_SESSION['username']; # or.. echo 'Welcome ' . !empty($_SESSION) ? $_SESSION['username'] : 'guest';
Facebook 拥有大量连接功能,但我发现以下四个最有用。
我可能遗漏了一些东西,但 FQL 似乎比 Graph API 更灵活、更简单。幸运的是,Facebook 仍然允许开发人员使用它,尽管使用新库,它已经发生了一些变化。
如果您想要用户 ID、名字、姓氏、用户图片的平方缩略图、可用的最大用户图片以及他或她的性别,您可以使用 users.getInfo
方法。
$uid = $facebook->getUser(); $api_call = array( 'method' => 'users.getinfo', 'uids' => $uid, 'fields' => 'uid, first_name, last_name, pic_square, pic_big, sex' ); $users_getinfo = $facebook->api($api_call);
您可以检查 Users.getInfo 可用字段的完整列表。
使用 FQL 可以获得相同的结果。
$uid = $facebook->getUser(); $fql_query = array( 'method' => 'fql.query', 'query' => 'SELECT uid, first_name, last_name, pic_square, pic_big, sex FROM user WHERE uid = ' . $uid ); $fql_info = $facebook->api($fql_query);
以下是可使用 FQL 访问的表的列表,以及表用户可用的字段。
Facebook 为应用程序提供与用户数据的某些交互 - 只要获得授权即可。在旧的 API 中,额外权限的授权仅适用于 Javascript SDK(尽管我不太确定)。借助新的 API,我们可以轻松地将用户重定向到 Facebook 中的授权对话框,并在访问被授予或拒绝后返回到我们的网站。
在以下示例中,我们将重定向用户以授权帖子状态更新、照片、视频和注释、用户的真实电子邮件地址、生日以及对照片和视频的访问权限。
$uid = $facebook->getUser(); # req_perms is a comma separated list of the permissions needed $url = $facebook->getLoginUrl(array( 'req_perms' => 'email,user_birthday,status_update,publish_stream,user_photos,user_videos' )); header("Location: {$url} ");
这是权限的完整列表。请注意,您可以指定用户接受时要定向到的 url 以及用户拒绝时要重定向到的 url。这些数组元素的键分别是 next
和 cancel_url
。这是一个简单的示例:
$url = $facebook->getLoginUrl(array( 'req_perms' => 'email', 'next' => 'http://localhost.com/thanks.php', 'cancel_url' => 'http://localhost.com/sorry.php' ));
如果未指定,则默认为请求脚本的位置。
由于用户可以轻松撤销权限,因此应用程序应始终在使用之前检查是否授予给定权限,特别是在发布某些内容时。我们将不得不使用旧版 API,因为新 API 似乎尚未完全实现它。
$uid = $facebook->getUser(); # users.hasAppPermission $api_call = array( 'method' => 'users.hasAppPermission', 'uid' => $uid, 'ext_perm' => 'publish_stream' ); $users_hasapppermission = $facebook->api($api_call); print_r($users_hasapppermission);
ext_perm
将仅支持旧的可用权限列表。
验证用户是否具有 publish_stream
权限后,让我们在墙上发布一些内容。
# let's check if the user has granted access to posting in the wall $api_call = array( 'method' => 'users.hasAppPermission', 'uid' => $uid, 'ext_perm' => 'publish_stream' ); $can_post = $facebook->api($api_call); if($can_post){ # post it! $facebook->api('/'.$uid.'/feed', 'post', array('message' => 'Saying hello from my Facebook app!')); echo 'Posted!'; } else { die('Permissions required!'); }
本质上,我们使用 POST 方法(第二个参数)和一个数组作为要发送的数据的第三个参数,对 /<user_id>/feed</user_id>
进行 API 调用。在这种情况下,第三个参数支持 message
、link
、picture
、caption
、name
和 description
。代码如下:
$facebook->api('/'.$uid.'/feed', 'post', array( 'message' => 'The message', 'name' => 'The name', 'description' => 'The description', 'caption' => 'The caption', 'picture' => 'http://i.imgur.com/yx3q2.png', 'link' => 'https://code.tutsplus.com ));
这是它的发布方式。
用户只需在他或她的墙上点击两次即可轻松撤销权限。您应该大量测试如果用户撤销对网站正常运行至关重要的一项或多项权限,或者即使应用程序被完全删除,可能会发生什么情况。这很重要。
虽然 Facebook 的身份验证功能确实很有用,但由于现在有很多人使用 Facebook,因此不建议将其用作网站中唯一的身份验证方法。那些没有 Facebook 帐户的人怎么办?他们不允许访问您的应用程序吗?感谢您的阅读!
以上是使用 Facebook Connect 驗證使用者身份的詳細內容。更多資訊請關注PHP中文網其他相關文章!