卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章16658本站已运行3320

使用 Facebook Connect 验证用户身份

最近,关于惰性注册的争论颇多。事实证明,用户思考的越少,转化率就越高!多好的想法啊!如果每个人似乎都有 Facebook 个人资料,为什么不添加一键式用户注册呢?今天我将向您展示如何做到这一点。


第 1 步。 设置

MySQL 表

让我们首先创建一个数据库表。


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_provideroauth_uid 字段,以区分不同的第三方开放身份验证协议及其标识符。例如,假设下周您认为让 Twitter 用户加入是个好主意。很简单;您只需为 oauthprovider 设置另一个值,并避免重复 oauthuid 值。

Facebook 应用程序

让我们首先创建一个新应用程序。为其命名并同意条款和条件。接下来,在基本选项卡中获取API KeySecret,如下所示。

使用 Facebook Connect 验证用户身份

在画布选项卡上,将Canvas URL授权后重定向URL设置为您的本地主机和脚本将处理的路径 - 类似于 http ://localhost.com/login_facebook.php?。注意末尾的问号和域;两者都是 Facebook 所要求的。只需将您的 hosts 文件设置为有效的域名即可。

使用 Facebook Connect 验证用户身份

在连接选项卡上,将连接 URL 设置为相同的值,并将 localhost.com (或您正在使用的)设置为基本域。

使用 Facebook Connect 验证用户身份

现在保存,下载客户端库,并将srcdir中的facebook.php解压到根目录中创建的新目录。


第 2 步。回调

身份验证流程分为三个步骤:

  1. 本地脚本生成一个 URL,请求用户许可
  2. Facebook 返回使用 GET 参数指定的 Canvas URL
  3. GET 参数对会话进行身份验证

我们在注册登录之前先进行一下快速测试。


# 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 Connect 验证用户身份

但是,可能存在两个问题。第一个:如果您重定向到 Facebook,但显示错误,则配置中可能缺少值。返回到您的应用程序设置并检查“连接”和“画布”选项卡,并确保这些字段正常,如上所述。

可能还有另一个问题,您会看到错误,例如“Uncaught CurlException: 60: SSL 证书问题,请验证 CA 证书是否正常。”发生这种情况是因为 CURL 设置。您必须打开 facebook.php,找到 makeRequest() 方法,然后在函数内找到此行:


$opts = self::$CURL_OPTS;

紧随其后,添加:


$opts[CURLOPT_SSL_VERIFYPEER] = false;

我讨厌破解库,但我还没有找到其他方法。好吧,让我们继续进行用户注册。我还添加了一个 try/catch 语句,因为如果 URL 中的 GET 参数中有旧的会话密钥,脚本将会因可怕的错误而终止。


第3步.注册和身份验证

接下来我们将使用 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';

第 4 步:其他方法

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。这些数组元素的键分别是 nextcancel_url。这是一个简单的示例:


$url = $facebook->getLoginUrl(array(
    'req_perms' => 'email',
    'next' => 'http://localhost.com/thanks.php',
    'cancel_url' => 'http://localhost.com/sorry.php'
));

如果未指定,则默认为请求脚本的位置。

使用 Facebook Connect 验证用户身份

检查扩展权限

由于用户可以轻松撤销权限,因此应用程序应始终在使用之前检查是否授予给定权限,特别是在发布某些内容时。我们将不得不使用旧版 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 方法(第二个参数)和一个数组作为要发送的数据的第三个参数,对 //feed 进行 API 调用。在这种情况下,第三个参数支持 messagelinkpicturecaptionnamedescription。代码如下:


$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 Connect 验证用户身份

您应该了解的一些其他信息:

用户只需在他或她的墙上点击两次即可轻松撤销权限。您应该大量测试如果用户撤销对网站正常运行至关重要的一项或多项权限,或者即使应用程序被完全删除,可能会发生什么情况。这很重要。

  • 在“应用程序设置”中,您可以通过点击右侧的 x 来完全删除该应用程序。
  • 您可以在“授予的附加权限”部分中单独删除权限。

5。结论

虽然 Facebook 的身份验证功能确实很有用,但由于现在有很多人使用 Facebook,因此不建议将其用作网站中唯一的身份验证方法。那些没有 F​​acebook 帐户的人怎么办?他们不允许访问您的应用程序吗?感谢您的阅读!

卓越飞翔博客
上一篇: python语言中%表示什么意思
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏