Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Sahkan pengguna menggunakan Facebook Connect

Sahkan pengguna menggunakan Facebook Connect

WBOY
WBOYasal
2023-08-29 13:41:011195semak imbas

Sejak kebelakangan ini, terdapat banyak perdebatan mengenai pendaftaran malas. Terbukti bahawa semakin kurang pengguna perlu berfikir, semakin tinggi kadar penukaran! Idea yang bagus! Jika semua orang nampaknya mempunyai profil Facebook, mengapa tidak menambah pendaftaran pengguna satu klik? Hari ini saya akan menunjukkan kepada anda bagaimana untuk melakukannya.


Langkah 1. Tetapan

Jadual MySQL

Mari kita buat jadual pangkalan data dahulu.

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;

Sangat mudah: kami akan menyediakan jadual maklumat pengguna yang mengandungi ID, nama pengguna, nama pertama dan akhir, URL gambar pengguna dan tarikh pendaftaran. Selain itu, kami telah menambah medan oauth_provider dan oauth_uid untuk membezakan antara protokol pengesahan terbuka pihak ketiga yang berbeza dan pengecamnya. Sebagai contoh, katakan minggu depan anda fikir adalah idea yang baik untuk meminta pengguna Twitter untuk menyertai. Mudah sahaja; anda hanya menetapkan nilai lain untuk oauthpembekal dan elakkan menduplikasi nilai oauthuid. 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)

Apl Facebook 🎜 🎜Mari mulakan dengan mencipta aplikasi baharu. Beri nama dan bersetuju dengan terma dan syarat. Seterusnya, dapatkan Kunci API dan Rahsia dalam tab Asas seperti yang ditunjukkan di bawah. 🎜 Gunakan Facebook Connect untuk mengesahkan identiti pengguna 🎜Pada tab kanvas, tetapkan URL Kanvas dan URL Ubah Hala Pasca Kebenaran kepada hos tempatan anda dan laluan yang akan dikendalikan oleh skrip - serupa dengan http: // localhost.com/login_facebook.php?. Perhatikan tanda soal dan domain di hujung; kedua-duanya diperlukan oleh Facebook. Hanya tetapkan fail hosts anda kepada nama domain yang sah. 🎜 Gunakan Facebook Connect untuk mengesahkan identiti pengguna 🎜Pada tab Sambungan, tetapkan URL Sambungan kepada nilai yang sama dan localhost.com (atau apa sahaja yang anda gunakan) sebagai domain asas. 🎜 Gunakan Facebook Connect untuk mengesahkan identiti pengguna 🎜Sekarang simpan, muat turun pustaka klien dan ekstrak facebook.php dalam srcdir ke direktori baharu yang dibuat dalam direktori akar. 🎜 🎜 🎜 🎜Langkah 2. 🎜Panggil balik🎜 🎜Proses pengesahan identiti terbahagi kepada tiga langkah: 🎜
  1. Skrip tempatan menjana URL yang meminta kebenaran pengguna
  2. Facebook mengembalikan URL Kanvas yang ditentukan menggunakan parameter GET
  3. Dapatkan sesi mengesahkan parameter
🎜Jom buat ujian cepat sebelum mendaftar dan log masuk. 🎜
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'];
}
🎜Sekarang, lawati http://localhost.com/login_facebook.php dan mari lihat apa yang berlaku. Jika anda diubah hala ke Facebook dan meminta kebenaran, kami berada di landasan yang betul. 🎜 Gunakan Facebook Connect untuk mengesahkan identiti pengguna 🎜Namun, mungkin ada dua masalah. Yang pertama: Jika anda diubah hala ke Facebook tetapi ralat dipaparkan, mungkin terdapat nilai yang hilang dalam konfigurasi. Kembali ke tetapan aplikasi anda dan semak tab "Sambungan" dan "Kanvas" dan pastikan medan tersebut OK, seperti yang dinyatakan di atas. 🎜 🎜 Mungkin terdapat satu lagi isu apabila anda melihat ralat seperti "Uncaught CurlException: 60: Masalah sijil SSL, sila sahkan bahawa sijil CA adalah OK Ini berlaku kerana tetapan CURL." Anda perlu membuka facebook.php, cari kaedah makeRequest() dan cari baris ini di dalam fungsi: 🎜
if(!empty($_SESSION)){
    header("Location: home.php");
}
🎜Ikutinya dengan menambah: 🎜
session_start();
if(!empty($_SESSION)){
    header("Location: login_facebook.php");
}
🎜Saya benci menggodam perpustakaan, tetapi saya belum menemui cara lain lagi. Baiklah, mari kita beralih kepada pendaftaran pengguna. Saya juga menambah pernyataan cuba/tangkap kerana jika terdapat kunci sesi lama dalam parameter GET dalam URL, skrip akan ditamatkan dengan ralat yang mengerikan. 🎜 🎜 🎜 🎜Langkah 3. 🎜Pendaftaran dan Pengesahan Identiti🎜 🎜Seterusnya kita akan menggunakan MySQL. Sila ambil perhatian bahawa saya tidak akan melaksanakan pembersih data kerana saya mahu kod itu sesingkat mungkin dan menyelesaikan tugas. Ingat ini: sentiasa bersihkan data anda. 🎜 🎜Pertama, mari sambung ke pangkalan data. 🎜
echo 'Welcome ' . $_SESSION['username'];
# or..
echo 'Welcome ' . !empty($_SESSION) ? $_SESSION['username'] : 'guest';
🎜Sekarang, mari kita uruskan keadaan $session sekiranya kita mempunyai sesi. 🎜
    $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);
🎜Sila ambil perhatian bahawa saya sedang menanyakan pangkalan data mencari facebook sebagai oauth_provider jika anda mahu menerima penyedia OAuth lain (seperti twitter, Akaun Google, Open ID, dsb. ) dan oauth_uid, ini biasanya idea yang baik kerana ia adalah pengecam yang disediakan oleh pembekal untuk akaun pengguna mereka. 🎜 🎜 Jika kami mengekalkan medan oauth_provider sebagai jenis medan teks, ia mungkin mengakibatkan prestasi yang lemah. Oleh itu, pilihan terbaik anda ialah menetapkannya kepada menaip ENUM. 🎜 🎜Kami kini mempunyai var $result yang mengandungi nilai yang ditanya daripada pangkalan data. Seterusnya mari tambah beberapa sesi. Tambahkan baris ini pada permulaan skrip. 🎜
    $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);
🎜Selepas syarat empty($result), tambahkan yang berikut: 🎜
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 方法(第二个参数)和一个数组作为要发送的数据的第三个参数,对 /<user_id>/feed</user_id> 进行 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 帐户的人怎么办?他们不允许访问您的应用程序吗?感谢您的阅读!

Atas ialah kandungan terperinci Sahkan pengguna menggunakan Facebook Connect. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn