yuca/sso

简单单点登录

v0.4.2 2019-10-24 12:33 UTC

This package is auto-updated.

Last update: 2024-09-25 10:54:36 UTC


README

注意:此版本是从https://github.com/jasny/sso 分支出来的,增加了以下功能

  • 支持NGINX服务器
  • 白名单IP
  • 缓存和会话第三方支持

Jasny\SSO是一个相对简单且直接的单点登录(SSO)实现方案。使用SSO,登录一个网站就可以验证您对所有关联网站的访问。

它如何工作

在SSO中,我们可以区分三方

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

代理有一个ID和一个秘密。这些代理和服务器都知道。

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

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

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

要了解更多信息,请阅读这篇文章

这与OAuth有什么不同?

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

用户使用Google OAuth登录到foo.com网站。然后他访问bar.org网站,该网站也使用Google OAuth。不管怎样,他仍然需要在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

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