首页 >后端开发 >php教程 >与Hybridauth的PHP中的社交登录

与Hybridauth的PHP中的社交登录

Joseph Gordon-Levitt
Joseph Gordon-Levitt原创
2025-02-18 11:26:10534浏览

许多现代网站都允许用户通过其社交网络帐户登录。例如,SitePoint 社区允许用户使用其 Facebook、Twitter、Google、Yahoo 或 GitHub 帐户登录,无需注册新帐户。

Social Logins in PHP with HybridAuth

本教程将介绍 HybridAuth —— 一个简化社交登录功能构建的 PHP 库。

HybridAuth 充当应用程序与各种社交 API 和身份提供商之间的抽象 API。

关键要点

  • HybridAuth 是一个 PHP 库,旨在简化社交登录集成到您的网站中,充当您的应用程序与各种社交 API 之间的中间层。
  • 建议通过 Composer 安装 HybridAuth,并且需要为每个社交网络(如 Facebook、Google 和 Twitter)配置特定的凭据才能正常运行。
  • 该库使用 OAuth 进行安全访问,确保在身份验证过程中保护用户凭据。
  • HybridAuth 允许自定义用户身份验证过程,不依赖于电子邮件或用户名,而是使用社交网络提供的唯一标识符。
  • 本教程提供了一个使用 Slim PHP 框架的实际演示,详细介绍了从设置环境到编写功能齐全的演示应用程序的步骤,该应用程序通过社交网络处理用户注册、登录和注销。

安装

推荐使用 Composer 安装 HybridAuth。我们还将使用 Slim 作为示例应用程序的基础。

<code>{
    "require": {
        "slim/slim": "2.*",
        "hybridauth/hybridauth": "2.3.0"
    }
}</code>

使用 HybridAuth 进行社交登录

要使用 HybridAuth,请将 /vendor/hybridauth/hybridauth/hybridauth 文件夹中的 config.phpindex.php (HybridAuth 端点文件) 复制到您的项目根文件夹。

index.php 文件重命名为 hybrid.php,因为 index.php 将由 Slim 框架用于我们的演示应用程序逻辑。

使用您的应用程序(例如 Facebook、Twitter 应用程序)凭据填充 config.php 文件。

例如,如果您希望用户通过 Facebook、Google 和 Twitter 登录您的网站;您的配置文件看起来应该像这样。我的应用程序 URL 是 http://slim.local

<code>return 
    [
        "base_url"   => "http://slim.local/",
        "providers"  => [
            "Google"   => [
                "enabled" => true,
                "keys"    => [ "id" => "", "secret" => "" ],
            ],
            "Facebook" => [
                "enabled"        => true,
                "keys"           => [ "id" => "", "secret" => "" ],
                "trustForwarded" => false
            ],
            "Twitter"  => [
                "enabled" => true,
                "keys"    => [ "key" => "", "secret" => "" ]
            ],
        ],
        "debug_mode" => true,
        "debug_file" => "bug.txt",
    ];</code>

注意:base_url 参数必须指向 HybridAuth 端点文件,在本例中为 hybrid.php

有关更多信息,请参阅 HybridAuth 配置文档。

接下来,加载 vendor 自动加载器并实例化类。

<code>require 'vendor/autoload.php';
$hybridauth = new Hybrid_Auth( 'config.php' );</code>

使用 authenticate 方法使用给定的提供程序对用户进行身份验证。

对于 Facebook:

<code>$adapter = $hybridauth->authenticate( "Facebook" );</code>

对于 Twitter:

<code>$adapter = $hybridauth->authenticate( "Twitter" );</code>

对于 Google:

<code>$adapter = $hybridauth->authenticate( "Google" );</code>

传递给 authenticate() 的参数必须与 config.php 文件中的提供程序数组键匹配。

身份验证后,使用 getUserProfile() 方法检索用户的个人资料数据。

<code>{
    "require": {
        "slim/slim": "2.*",
        "hybridauth/hybridauth": "2.3.0"
    }
}</code>

$user_profile 变量将是一个对象,其中包含返回的用户个人资料数据。

更多社交提供商

要向现有提供商添加更多提供商,例如 GitHub,请将 GitHub.php 文件从 vendor/hybridauth/hybridauth/additional-providers/hybridauth-github/Providers 复制到应用程序中的某个位置(在本例中为提供程序目录)。使用提供程序包装器加载文件,其中 path 是 GitHub 文件的路径,class 是其 PHP 类的名称。

<code>return 
    [
        "base_url"   => "http://slim.local/",
        "providers"  => [
            "Google"   => [
                "enabled" => true,
                "keys"    => [ "id" => "", "secret" => "" ],
            ],
            "Facebook" => [
                "enabled"        => true,
                "keys"           => [ "id" => "", "secret" => "" ],
                "trustForwarded" => false
            ],
            "Twitter"  => [
                "enabled" => true,
                "keys"    => [ "key" => "", "secret" => "" ]
            ],
        ],
        "debug_mode" => true,
        "debug_file" => "bug.txt",
    ];</code>

使用 HybridAuth 的 authenticate() 方法使用 GitHub 对用户进行身份验证,如下所示:

<code>require 'vendor/autoload.php';
$hybridauth = new Hybrid_Auth( 'config.php' );</code>

社交登录实现

通常,每个具有登录和注册系统的网站都使用用户的电子邮件地址或用户名来识别和登录其帐户。如果您打算实现社交登录功能,建议不要使用用户的用户名或电子邮件进行身份验证。

反对这种做法的一个原因是,例如,Twitter 不会返回通过其身份验证的用户电子邮件地址。也就是说,返回的个人资料数据不包含用户的电子邮件。

大多数(如果不是全部)社交提供商,如 Facebook、Twitter、Google、LinkedIn 甚至 GitHub,在授权后都会返回唯一的用户标识号。

不要使用用户的电子邮件将其登录到其帐户,而是使用社交提供商返回的标识符,如下所示:如果用户没有帐户,则创建用户帐户;如果用户有帐户,则将其登录到网站。

编写演示应用程序

我们将使用 Slim PHP 框架构建一个简单的 Web 应用程序,以演示如何实现使用 HybridAuth 进行社交登录的实际示例。

我假设您已安装 HybridAuth 和 Slim 框架。否则,请参阅上面的安装指南。

应用程序结构

<code>$adapter = $hybridauth->authenticate( "Facebook" );</code>

这是数据库表的 SQL。

<code>$adapter = $hybridauth->authenticate( "Twitter" );</code>

编写应用程序模型

应用程序模型的所有代码都应放在 src 文件夹中的 App_Model.php 文件中。

该文件命名空间为 Model,后跟类定义和构造函数。

<code>$adapter = $hybridauth->authenticate( "Google" );</code>

identifier_exists 方法如果标识符(用户标识号)已存在于数据库中则返回 true,否则返回 false。

<code>$user_profile = $adapter->getUserProfile();</code>

register_user 方法将用户个人资料数据插入数据库。

<code>"Github"   => [
    "enabled" => true,
    "keys"    => [
        "id"     => "",
        "secret" => ""
    ],
    "wrapper" => [ "path" => "providers/GitHub.php", "class" => "Hybrid_Providers_GitHub" ]
]</code>

login_user 方法在调用时,将创建的用户会话添加到 HybridAuth 会话(在提供商成功授权用户后创建)。

<code>$adapter = $hybridauth->authenticate( "Github" );</code>

logout_user 方法在单击注销链接时删除或销毁用户的会话。

<code>|-scr/
|----App_Model.php
|-templates/
|----login.php
|----welcome.php
|-vendor/
|-composer.json
|-config.php
|-hybrid.php
|-index.php
|-.htaccess</code>

最后,getter 方法返回用户的姓名、电子邮件和头像 URL。

<code>{
    "require": {
        "slim/slim": "2.*",
        "hybridauth/hybridauth": "2.3.0"
    }
}</code>

通过将以下代码添加到您的 composer.json 文件中,为 Model 类注册 PSR-4 自动加载器。

<code>return 
    [
        "base_url"   => "http://slim.local/",
        "providers"  => [
            "Google"   => [
                "enabled" => true,
                "keys"    => [ "id" => "", "secret" => "" ],
            ],
            "Facebook" => [
                "enabled"        => true,
                "keys"           => [ "id" => "", "secret" => "" ],
                "trustForwarded" => false
            ],
            "Twitter"  => [
                "enabled" => true,
                "keys"    => [ "key" => "", "secret" => "" ]
            ],
        ],
        "debug_mode" => true,
        "debug_file" => "bug.txt",
    ];</code>

运行 composer dump-autoload 以重新生成 vendor/autoload.php 文件。

应用程序逻辑

在应用程序 index.php 文件中加载 composer 自动加载文件并实例化 Slim。

<code>require 'vendor/autoload.php';
$hybridauth = new Hybrid_Auth( 'config.php' );</code>

创建一个名为 templates 的目录来存储所有模板文件,然后在 Slim 中注册或配置它,如下所示:

<code>$adapter = $hybridauth->authenticate( "Facebook" );</code>

创建一个 Slim 数据库单例资源,该资源在调用时将返回数据库连接实例。

<code>$adapter = $hybridauth->authenticate( "Twitter" );</code>

还创建了另一个返回 HybridAuth 实例的单例资源。

<code>$adapter = $hybridauth->authenticate( "Google" );</code>

通过传递数据库连接作为参数来实例化应用程序模型类。

<code>$user_profile = $adapter->getUserProfile();</code>

下面的 authenticate 函数在作为参数添加到路由时,如果用户未登录,则将其重定向到登录页面。

<code>"Github"   => [
    "enabled" => true,
    "keys"    => [
        "id"     => "",
        "secret" => ""
    ],
    "wrapper" => [ "path" => "providers/GitHub.php", "class" => "Hybrid_Providers_GitHub" ]
]</code>

当注销的用户访问应用程序主页或索引页面时,将其重定向到登录页面。

<code>$adapter = $hybridauth->authenticate( "Github" );</code>

以下是社交登录链接的路由定义。即,当单击链接 http://slim.local/login/facebook 时,HybridAuth 将用户重定向到 Facebook 以进行授权。Twitter http://slim.local/login/twitter、Google http://slim.local/login/google 和所有其他受支持的提供商也是如此。

<code>|-scr/
|----App_Model.php
|-templates/
|----login.php
|----welcome.php
|-vendor/
|-composer.json
|-config.php
|-hybrid.php
|-index.php
|-.htaccess</code>

调用 HybridAuth 的 authenticate() 方法将用户重定向到给定的社交提供商。

成功授权后,$user_profile 变量将填充用户个人资料数据。

调用 identifier_exists() 方法检查用户标识符是否在数据库中存在。如果为真,则用户登录到网站。否则,将为用户创建一个帐户,然后用户登录。

这是注销路由的代码。

<code class="language-sql">CREATE TABLE IF NOT EXISTS `users` (
`id` int(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY  (id),
  `identifier` varchar(50) NOT NULL,
UNIQUE KEY `identifier` (`identifier`),
  `email` varchar(50) DEFAULT NULL,
  `first_name` varchar(20) DEFAULT NULL,
  `last_name` varchar(20) DEFAULT NULL,
  `avatar_url` varchar(255)
) ENGINE=InnoDB;</code>

我们已经在模型类中讨论过的 logout_user 方法被调用以销毁用户会话,并且还调用 Hybrid_Auth::logoutAllProviders() 以将用户注销出连接的提供商。

用户登录后重定向到的欢迎页面的路由:

<code class="language-php"><?php namespace Model;

class App_Model
{

    /** @var object Database connection */
    private $conn;

    /**
     * Instantiate the model class.
     *
     * @param object $db_connection DB connection
     */
    public function __construct(\PDO $db_connection)
    {
        $this->conn = $db_connection;
    }

    // ... rest of the methods ...
}</code>

最后,运行 Slim 应用程序。

<code class="language-php">/**
     * Check if a HybridAuth identifier already exists in DB
     *
     * @param int $identifier
     *
     * @return bool
     */
    public function identifier_exists($identifier)
    {
        try {
            $sql    = 'SELECT identifier FROM users';
            $query  = $this->conn->query($sql);
            $result = $query->fetchAll(\PDO::FETCH_COLUMN, 0);

            return in_array($identifier, $result);
        } catch ( \PDOException $e ) {
            die( $e->getMessage() );
        }

    }</code>

请参阅应用程序的 GitHub 存储库以获取完整的源代码。

结论

在本文中,我们学习了如何使用功能强大且健壮的 HybridAuth PHP 库将社交登录功能与网站集成。

如果您有任何疑问或贡献,请在评论中告诉我们。

使用 PHP 和 HybridAuth 进行社交登录的常见问题解答 (FAQ)

什么是 HybridAuth,它如何与 PHP 一起用于社交登录?

HybridAuth 是一个流行的开源社交登录 PHP 库。它允许 Web 开发人员轻松构建社交应用程序,方法是提供一种简单的方法来通过用户的社交媒体帐户对其进行身份验证。HybridAuth 充当应用程序与各种社交 API 和身份提供商(如 Facebook、Twitter 和 Google)之间的抽象 API。它的工作原理是与 PHP 应用程序中现有的登录系统集成,并添加社交登录功能。

如何在我的 PHP 应用程序中安装和配置 HybridAuth?

HybridAuth 可以通过 Composer(PHP 中的依赖项管理工具)安装。安装后,您需要通过设置要使用的提供商(社交网络)来对其进行配置。每个提供商都需要一组唯一的参数,例如密钥和密钥,您可以通过在各个社交网络的开发者平台上创建应用程序来获得这些参数。

HybridAuth 用于社交登录的安全级别如何?

HybridAuth 非常安全,因为它使用 OAuth(一种开放的访问委托标准)。OAuth 提供安全的指定访问,这意味着用户可以授予网站访问其在其他网站上的信息的权限,而无需向其提供密码。这使得 HybridAuth 成为实现社交登录的安全选择。

我可以在多个网站上使用 HybridAuth 进行社交登录吗?

是的,HybridAuth 可用于多个网站。您只需要使用每个网站的正确回调 URL 配置库即可。这使得它成为管理多个网站的开发人员的灵活解决方案。

如何处理 HybridAuth 中的错误?

HybridAuth 具有内置的错误处理系统。发生错误时,它会抛出异常,您可以根据应用程序的错误处理策略捕获和处理该异常。这使得调试和修复问题变得更容易。

我可以自定义 HybridAuth 的社交登录按钮的外观和风格吗?

是的,您可以自定义社交登录按钮的外观和风格。HybridAuth 提供社交登录的功能,但按钮的设计和布局完全取决于您。

如何在我的 PHP 应用程序中更新 HybridAuth 库?

更新 HybridAuth 就像在 Composer 中运行命令一样简单。这确保您始终拥有包含所有安全补丁和更新的最新版本。

我可以将 HybridAuth 与其他 PHP 框架一起使用吗?

是的,HybridAuth 与框架无关,可以与任何 PHP 框架一起使用。这使得它成为使用不同 PHP 框架的开发人员的多功能选择。

如何在我的本地开发环境中测试 HybridAuth 的社交登录?

在本地测试社交登录可能很棘手,因为社交网络需要有效的回调 URL。但是,您可以使用 ngrok 等工具将本地服务器公开到互联网,并将该 URL 用作回调 URL。

我可以使用 HybridAuth 通过非社交帐户(如电子邮件和密码)对用户进行身份验证吗?

不可以,HybridAuth 专为社交登录而设计。对于传统的电子邮件和密码身份验证,您需要使用其他 PHP 库或构建您自己的身份验证系统。

The output maintains the original image formatting and placement. The text has been paraphrased and reorganized to improve flow and readability while preserving the original meaning. The code examples remain unchanged.

以上是与Hybridauth的PHP中的社交登录的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn