Authentifier les utilisateurs à l'aide de Facebook Connect

WBOY
Libérer: 2023-08-29 13:42:01
original
1224 Les gens l'ont consulté

Récemment, il y a eu beaucoup de débats sur l'inscription paresseuse. Il est prouvé que moins les utilisateurs réfléchissent, plus le taux de conversion est élevé ! Quelle belle idée ! Si tout le monde semble avoir un profil Facebook, pourquoi ne pas ajouter l’inscription des utilisateurs en un clic ? Aujourd'hui, je vais vous montrer comment faire cela.


Étape 1. Paramètres

Table MySQL

Créons d'abord une table de base de données.

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;
Copier après la connexion

Très simple : nous mettrons en place un tableau d'informations utilisateur qui contient l'identifiant, le nom d'utilisateur, le prénom et le nom, l'URL de la photo de l'utilisateur et la date d'inscription. De plus, nous avons ajouté le champ oauth_provideroauth_uid pour différencier les différents protocoles d'authentification ouverts tiers et leurs identifiants. Par exemple, disons que la semaine prochaine vous pensez que ce serait une bonne idée de demander aux utilisateurs de Twitter de nous rejoindre. C'est simple : il vous suffit de définir une autre valeur pour oauthprovider et d'éviter de dupliquer la valeur oauthuid.

Application Facebook

Commençons par créer une nouvelle application. Donnez-lui un nom et acceptez les termes et conditions. Ensuite, récupérez la API Key et le Secret dans l'onglet Basic comme indiqué ci-dessous.

使用 Facebook Connect 验证用户身份

Dans l'onglet Canvas, définissez l'URL Canvas et l'URL de redirection post-autorisation sur votre hôte local et le chemin que le script gérera - de la même manière que pour définir le fichier http ://localhost.com/login_facebook.php?。注意末尾的问号和域;两者都是 Facebook 所要求的。只需将您的 hosts sur un nom de domaine valide.

使用 Facebook Connect 验证用户身份

Dans l'onglet Connexion, définissez l'URL de connexion sur la même valeur et localhost.com (ou tout ce que vous utilisez) comme domaine de base.

使用 Facebook Connect 验证用户身份

Maintenant, enregistrez, téléchargez la bibliothèque client et srcdir中的facebook.phpextrayez-la dans le nouveau répertoire créé dans le répertoire racine.


Étape 2. Rappel

Le processus de vérification d'identité est divisé en trois étapes :

  1. Le script local génère une URL demandant l'autorisation de l'utilisateur
  2. Facebook renvoie l'URL Canvas spécifiée à l'aide des paramètres GET
  3. OBTENIR les paramètres pour authentifier la session

Faisons un test rapide avant de vous inscrire et de vous connecter.

# 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);
}
Copier après la connexion

Maintenant, visitez http://localhost.com/login_facebook.php et voyons ce qui se passe. Si vous êtes redirigé vers Facebook et que l'on vous demande l'autorisation, nous sommes sur la bonne voie.

使用 Facebook Connect 验证用户身份

Cependant, il peut y avoir deux problèmes. Première : Si vous êtes redirigé vers Facebook mais qu'une erreur s'affiche, il se peut qu'il manque une valeur dans la configuration. Revenez aux paramètres de votre application et vérifiez les onglets « Connexions » et « Toile » et assurez-vous que ces champs sont OK, comme mentionné ci-dessus.

Il peut y avoir un autre problème où vous voyez une erreur telle que « Uncaught CurlException : 60 : Problème de certificat SSL, veuillez vérifier que le certificat CA est OK. » Cela se produit en raison des paramètres CURL. Vous devez ouvrir facebook.php, trouver la méthode makeRequest(), puis trouver cette ligne à l'intérieur de la fonction :

$opts = self::$CURL_OPTS;
Copier après la connexion

Suivez-le en ajoutant :

$opts[CURLOPT_SSL_VERIFYPEER] = false;
Copier après la connexion

Je déteste pirater les bibliothèques, mais je n'ai pas encore trouvé d'autre moyen. Bon, passons à l'enregistrement des utilisateurs. J'ai également ajouté une instruction try/catch car s'il y a une ancienne clé de session dans le paramètre GET de l'URL, le script se terminera avec une horrible erreur.


Étape 3. Inscription et vérification d'identité

Ensuite, nous utiliserons MySQL. Veuillez noter que je n'implémenterai pas de nettoyeur de données car je souhaite que le code soit aussi court que possible et que le travail soit fait. N'oubliez pas ceci : nettoyez toujours vos données.

Tout d’abord, connectons-nous à la base de données.

mysql_connect('localhost', 'YOUR_USERNAME', 'YOUR_PASSWORD');
mysql_select_db('YOUR_DATABASE');
Copier après la connexion

Maintenant, gérons la condition $session au cas où nous aurions une séance.

# 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);
}
Copier après la connexion

Notez que j'interroge la base de données à la recherche de facebook 作为 oauth_provider;如果您想接受其他 OAuth 提供商(如 twitter、Google 帐户、Open ID 等)和 oauth_uid, ce qui est généralement une bonne idée puisqu'il s'agit de l'identifiant fourni par le fournisseur pour son compte utilisateur.

Si nous oauth_provider 字段保留为 text le type de champ, cela peut entraîner de mauvaises performances. Par conséquent, votre meilleure option est de le configurer pour taper ENUM.

Nous avons maintenant une $result var qui contient la valeur interrogée dans la base de données. Ajoutons ensuite quelques sessions. Ajoutez cette ligne au début du script.

session_start();
Copier après la connexion

Après la empty($result) condition, ajoutez ce qui suit :

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'];
}
Copier après la connexion

由于对已登录的用户进行身份验证没有什么意义,因此在 session_start() 行下方添加:

if(!empty($_SESSION)){
    header("Location: home.php");
}
Copier après la connexion

在需要身份验证的脚本中,只需添加:

session_start();
if(!empty($_SESSION)){
    header("Location: login_facebook.php");
}
Copier après la connexion

如果您想显示用户名,请将其作为数组访问。

echo 'Welcome ' . $_SESSION['username'];
# or..
echo 'Welcome ' . !empty($_SESSION) ? $_SESSION['username'] : 'guest';
Copier après la connexion

第 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);
Copier après la connexion

您可以检查 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);
Copier après la connexion

以下是可使用 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} ");
Copier après la connexion

这是权限的完整列表。请注意,您可以指定用户接受时要定向到的 url 以及用户拒绝时要重定向到的 url。这些数组元素的键分别是 nextcancel_url。这是一个简单的示例:

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

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

使用 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);
Copier après la connexion

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!');
    }
Copier après la connexion

本质上,我们使用 POST 方法(第二个参数)和一个数组作为要发送的数据的第三个参数,对 /<user_id>/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
));
Copier après la connexion

这是它的发布方式。

使用 Facebook Connect 验证用户身份

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

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

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

5。结论

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!