tw88 / sso
简单的单点登录
Requires
- php: >=8.3.0
- desarrolla2/cache: ^2.0.0
- guzzlehttp/guzzle: ^7.0
- jasny/validation-result: ^1.0.0
Requires (Dev)
- codeception/codeception: ^2.1.0
- jasny/php-code-quality: ^1.1.0
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);
有关更多信息,请查看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
注意,登录后,您需要在其他代理上刷新以看到效果。