yuca / sso
简单单点登录
Requires
- php: >=5.5.0
- jasny/validation-result: ^1.0.0
Requires (Dev)
- codeception/codeception: ^2.1.0
- jasny/php-code-quality: ^1.1.0
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);
有关更多信息,请参阅 broker
和 ajax-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://:9001、https://:9002 和 https://:9003。用户名/密码:jackie/jackie123、john/john123
请注意,登录后,您需要在其他代理上刷新才能看到效果。