Heim  >  Artikel  >  Backend-Entwicklung  >  Authentifizieren Sie Benutzer mit Facebook Connect

Authentifizieren Sie Benutzer mit Facebook Connect

WBOY
WBOYOriginal
2023-08-29 13:41:011197Durchsuche

In letzter Zeit gab es viele Debatten über die verzögerte Registrierung. Es ist erwiesen: Je weniger Benutzer nachdenken müssen, desto höher ist die Conversion-Rate! Was für eine tolle Idee! Wenn scheinbar jeder ein Facebook-Profil hat, warum nicht die Benutzerregistrierung mit einem Klick hinzufügen? Heute zeige ich Ihnen, wie das geht.


Schritt 1. Einstellungen

MySQL-Tabelle

Lassen Sie uns zunächst eine Datenbanktabelle erstellen.

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;

Ganz einfach: Wir richten eine Benutzerinformationstabelle ein, die die ID, den Benutzernamen, den Vor- und Nachnamen, die URL des Benutzerbilds und das Registrierungsdatum enthält. Darüber hinaus haben wir das Feld oauth_provideroauth_uid hinzugefügt, um zwischen verschiedenen offenen Authentifizierungsprotokollen von Drittanbietern und ihren Kennungen zu unterscheiden. Nehmen wir zum Beispiel an, dass Sie nächste Woche der Meinung sind, dass es eine gute Idee wäre, Twitter-Benutzer zum Beitritt aufzufordern. Es ist ganz einfach: Sie legen einfach einen anderen Wert für den oauth-Provider fest und vermeiden eine Duplizierung des oauth-uid-Werts. Facebook-App

Beginnen wir mit der Erstellung einer neuen Anwendung. Nennen Sie es und stimmen Sie den Allgemeinen Geschäftsbedingungen zu. Rufen Sie als Nächstes den

API-Schlüssel

und das Geheimnis auf der Registerkarte „Grundlegend“ ab, wie unten gezeigt.

Legen Sie auf der Registerkarte „Canvas“ die 使用 Facebook Connect 验证用户身份Canvas-URL

und die Post-Authorization-Redirect-URL auf Ihren lokalen Host und den Pfad fest, den das Skript verarbeiten soll – ähnlich wie beim Festlegen der -Datei auf einen gültigen Domänennamen. http ://localhost.com/login_facebook.php?。注意末尾的问号和域;两者都是 Facebook 所要求的。只需将您的 hosts

Stellen Sie auf der Registerkarte „Verbindung“ die Verbindungs-URL auf denselben Wert und 使用 Facebook Connect 验证用户身份 (oder was auch immer Sie verwenden) als Basisdomäne ein.

localhost.com

Speichern Sie nun die Client-Bibliothek, laden Sie sie herunter und 使用 Facebook Connect 验证用户身份Extrahieren Sie sie in das neue Verzeichnis, das im Stammverzeichnis erstellt wurde.

srcdir中的facebook.php


Schritt 2.

Rückruf Der Identitätsprüfungsprozess ist in drei Schritte unterteilt:

Lokales Skript generiert eine URL, die eine Benutzerberechtigung anfordert
  1. Facebook gibt die mit GET-Parametern angegebene Canvas-URL zurück
  2. GET-Parameter zur Authentifizierung der Sitzung
  3. Machen Sie einen kurzen Test, bevor Sie sich registrieren und anmelden.
# 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);
}

Jetzt besuchen Sie

und lassen Sie uns sehen, was passiert. Wenn Sie zu Facebook weitergeleitet und um Erlaubnis gebeten werden, sind wir auf dem richtigen Weg.

http://localhost.com/login_facebook.php

Es kann jedoch zwei Probleme geben. Erstens: Wenn Sie zu Facebook weitergeleitet werden, aber ein Fehler angezeigt wird, fehlt möglicherweise ein Wert in der Konfiguration. Gehen Sie zurück zu Ihren Anwendungseinstellungen, überprüfen Sie die Registerkarten „Verbindungen“ und „Canvas“ und stellen Sie sicher, dass diese Felder wie oben erwähnt in Ordnung sind. 使用 Facebook Connect 验证用户身份

Möglicherweise liegt ein anderes Problem vor, bei dem eine Fehlermeldung wie „Uncaught CurlException: 60: SSL-Zertifikatsproblem, bitte überprüfen Sie, ob das CA-Zertifikat in Ordnung ist“ angezeigt wird. Dies liegt an den CURL-Einstellungen. Sie müssen

öffnen, die Methode makeRequest() suchen und dann diese Zeile in der Funktion finden:

$opts = self::$CURL_OPTS;
facebook.phpFolgen Sie ihm, indem Sie Folgendes hinzufügen:

$opts[CURLOPT_SSL_VERIFYPEER] = false;

Ich hasse es, Bibliotheken zu hacken, aber ich habe noch keinen anderen Weg gefunden. Okay, fahren wir mit der Benutzerregistrierung fort. Ich habe auch eine try/catch-Anweisung hinzugefügt, denn wenn der GET-Parameter in der URL einen alten Sitzungsschlüssel enthält, wird das Skript mit einem schrecklichen Fehler beendet.


Schritt 3.

Registrierung und Identitätsprüfung Als nächstes werden wir MySQL verwenden. Bitte beachten Sie, dass ich keinen Datenreiniger implementieren werde, da ich möchte, dass der Code so kurz wie möglich ist und die Arbeit erledigt wird. Denken Sie daran: Bereinigen Sie Ihre Daten immer.

Stellen Sie zunächst eine Verbindung zur Datenbank her.

mysql_connect('localhost', 'YOUR_USERNAME', 'YOUR_PASSWORD');
mysql_select_db('YOUR_DATABASE');

Jetzt kümmern wir uns um die

Bedingung für den Fall, dass wir eine Sitzung haben.

# 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);
}
$sessionBeachten Sie, dass ich die Datenbank nach

abfrage, was im Allgemeinen eine gute Idee ist, da es sich um die vom Anbieter für sein Benutzerkonto bereitgestellte Kennung handelt.

facebook 作为 oauth_provider;如果您想接受其他 OAuth 提供商(如 twitter、Google 帐户、Open ID 等)和 oauth_uid Wenn wir den Feldtyp ändern, kann dies zu einer schlechten Leistung führen. Daher ist es am besten, den Typ ENUM festzulegen.

Wir haben jetzt eine oauth_provider 字段保留为 text Variable, die den aus der Datenbank abgefragten Wert enthält. Als nächstes fügen wir einige Sitzungen hinzu. Fügen Sie diese Zeile am Anfang des Skripts hinzu.

session_start();

Hängen Sie nach der $result-Bedingung Folgendes an:

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 帐户的人怎么办?他们不允许访问您的应用程序吗?感谢您的阅读!

Das obige ist der detaillierte Inhalt vonAuthentifizieren Sie Benutzer mit Facebook Connect. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn