tw88/sso

简单的单点登录

2.0.4 2024-08-20 12:03 UTC

This package is auto-updated.

Last update: 2024-09-20 12:10:33 UTC


README

一个支持cookie的Jasny\SSO分支。

工作原理

在使用SSO时,何时可以区分三方

  • 客户端 - 这是指访问者的浏览器
  • 代理 - 被访问的网站
  • 服务器 - 存储用户信息和凭据的地方

代理有一个ID和一个密钥。这两者都为代理和服务器所知。

当客户端访问代理时,它创建一个随机令牌,并将其存储在cookie中。然后代理会将客户端发送到服务器,同时传递代理的ID和令牌。服务器将使用代理ID、代理密钥和令牌创建一个哈希。这个哈希用于创建用户会话的链接。链接创建后,服务器将客户端重定向回代理。

代理可以使用令牌(来自cookie)、代理ID和代理密钥创建相同的链接哈希。在进行请求时,它将那个哈希作为会话ID传递。

服务器会注意到会话ID是一个链接,并使用链接会话。因此,代理和客户端正在使用相同的会话。当另一个代理加入时,它也将使用相同的会话。

对于更深入的解释,请阅读这篇文章

这与OAuth有何不同?

使用OAuth,您可以在外部服务器上验证用户并获取他们的个人资料信息。然而,您并没有共享会话。

用户使用Google OAuth登录到foo.com网站。接下来,他访问了也使用Google OAuth的bar.org网站。无论怎样,他仍然需要在bar.org上点击“登录”按钮。

Jasny/SSO中,两个网站使用相同的会话。因此,当用户访问bar.org时,他会自动登录。当他从任一网站注销时(无论是哪一个),都会同时注销。

安装

通过composer安装此库

composer require jasny/sso

使用方法

服务器

Jasny\SSO\Server是一个抽象类。您需要创建一个实现抽象方法的自己的类。这些方法是从数据源(如数据库)获取数据。

class MySSOServer extends Jasny\SSO\Server
{
    /**
     * Authenticate using user credentials
     *
     * @param string $username
     * @param string $password
     * @return \Jasny\ValidationResult
     */
    abstract protected function authenticate($username, $password)
    {
        ...
    }

    /**
     * Get the secret key and other info of a broker
     *
     * @param string $brokerId
     * @return array
     */
    abstract protected function getBrokerInfo($brokerId)
    {
        ...
    }

    /**
     * Get the information about a user
     *
     * @param string $username
     * @return array|object
     */
    abstract protected function getUserInfo($username)
    {
        ...
    }
}

MySSOServer类可以用作MVC框架中的控制器。

或者,您可以将MySSOServer用作库类。在这种情况下,将fail_exception选项传递给构造函数。这将使对象抛出Jasny\SSO\Exception,而不是设置HTTP响应并退出。

有关更多信息,请查看server示例。

代理

创建Jasny\SSO\Broker实例时,您需要传递服务器URL、代理ID和代理密钥。代理ID和密钥需要在服务器上注册(在调用getBrokerInfo($brokerId)时获取)。

请注意代理ID应该是字母数字的。无论如何,它绝对不能包含“-”字符。

接下来,您需要调用attach()。这将生成一个令牌,并将客户端重定向到服务器以将令牌附加到客户端的会话。如果客户端已经附加,该函数将简单地返回。

当会话附加后,您可以执行登录/注销或获取用户信息等操作。

$broker = new Jasny\SSO\Broker($serverUrl, $brokerId, $brokerSecret);
$broker->attach();

$user = $broker->getUserInfo();
echo json_encode($user);

有关更多信息,请查看brokerajax-broker示例。

示例

有一个示例服务器和两个示例代理。一个使用正常的重定向,另一个使用JSONP / AJAX。

为了验证其是否正常工作,您应设置服务器和两个或更多代理,每个代理都在自己的机器上,并拥有自己的(子)域名。然而,您也可以在自己的机器上运行服务器和代理,只是为了测试。

在*nix(Linux / Unix / OSX)上运行

php -S localhost:9000 -t examples/server/
export SSO_SERVER=https://:9000 SSO_BROKER_ID=Alice SSO_BROKER_SECRET=8iwzik1bwd; php -S localhost:9001 -t examples/broker/
export SSO_SERVER=https://:9000 SSO_BROKER_ID=Greg SSO_BROKER_SECRET=7pypoox2pc; php -S localhost:9002 -t examples/broker/
export SSO_SERVER=https://:9000 SSO_BROKER_ID=Julias SSO_BROKER_SECRET=ceda63kmhp; php -S localhost:9003 -t examples/ajax-broker/

现在打开一些标签页,访问 https://:9001https://:9002https://:9003。用户名/密码 jackie/jackie123 john/john123

注意,登录后,您需要在其他代理上刷新以看到效果。