esyede / sso
适用于Laravel的简单PHP SSO软件包
Requires
- php: ^8.1
- guzzlehttp/guzzle: ^7.2
- laravel/framework: ^10.0
README
适用于Laravel的简单PHP单点登录软件包
要求
- Laravel 10x
- PHP >=8.1
词语含义
- SSO - 单点登录。
- 服务器 - 作为SSO服务器工作的页面,处理身份验证,存储所有会话数据。
- 代理 - 被客户端/用户访问的您的页面。
- 客户端/用户 - 您的每一位访客。
它是如何工作的?
客户端访问代理并生成唯一的令牌。当生成新令牌时,我们需要将客户端会话附加到代理中的其会话,以便他将被重定向到服务器并返回到代理。此时,在服务器中创建新的会话并将其与代理页面的客户端会话相关联。当客户端访问其他代理时,将执行相同的步骤,但是当客户端被重定向到服务器时,他已使用其旧会话和与代理#1关联的相同会话ID。
安装
服务器
使用Composer安装此软件包。
composer require esyede/sso
将配置文件复制到Laravel项目的 config/
文件夹。
php artisan vendor:publish --provider="Esyede\SSO\SSOServiceProvider"
创建一个表,用于保存所有代理。
php artisan migrate --path=vendor/esyede/sso/database/migrations
编辑 app/Http/Kernel.php
,从 api
中间件数组中删除throttle中间件,并添加session中间件。这是必要的,因为我们需要在API路由中启用session,而throttle中间件可能会阻止我们需要的连接。
'api' => [ // .. \Illuminate\Routing\Middleware\SubtituteBindings::class \Illuminate\Session\Middleware\StartSession::class, ],
现在您应该创建代理。您可以使用以下Artisan CLI命令创建新的代理
$ php artisan sso:broker-create {name}
注意:代理名称不应包含非字母数字字符。
代理
使用Composer安装此软件包。
$ composer require esyede/sso
将配置文件复制到Laravel项目的 config/
文件夹。
$ php artisan vendor:publish --provider="Esyede\SSO\SSOServiceProvider"
将 config/sso.php
文件中的 type
值从 server
更改为 broker
。
如果您想在返回数据时使用关系,请设置选项 SSO_WITH_RELATIONSHIP = true
,并在 config/
中设置 relation_name
为服务器中用户模型的关联名称。
在您的 .env
文件中设置3个新选项
SSO_SERVER_URL= SSO_BROKER_NAME= SSO_BROKER_SECRET=
SSO_SERVER_URL
是您的服务器http url,不带尾随斜杠。SSO_BROKER_NAME
和 SSO_BROKER_SECRET
必须是存在于您的服务器 brokers
表中的数据。
编辑您的 app/Http/Kernel.php
,向 web
中间件组添加 \Esyede\SSO\Middleware\SSOAutoLogin::class
中间件。它应该看起来像这样
protected $middlewareGroups = [ 'web' => [ // ... \Esyede\SSO\Middleware\SSOAutoLogin::class, ], 'api' => [ // ... ], ];
最后但并非最不重要的是,您需要编辑 app/Http/Controllers/Auth/LoginController.php
。您应该在 LoginController
类中添加两个函数,这些函数将通过SSO服务器而不是代理页面来验证您的客户端。
protected function attemptLogin(Request $request) { $credentials = $this->credentials($request); return (new \Esyede\SSO\LaravelSSOBroker)->login($credentials['phone'], $credentials['password']); } public function logout(Request $request) { (new \Esyede\SSO\LaravelSSOBroker)->logout(); $this->guard()->logout(); $request->session()->invalidate(); return redirect('/'); }
到此为止。对于其他代理页面,您应该从开始重复一切,只需更改配置文件中的代理名称和密钥即可。
.env
选项示例
SSO_SERVER_URL=https://server.test SSO_BROKER_NAME=site1 SSO_BROKER_SECRET=892asjdajsdksja74jh38kljk2929023
多模式
您可以通过以下方式使用多模式
您必须使用最新版本才能使用此功能。
- 在
server
和client
的配置文件sso.php
中,必须将multi_enabled
选项设置为 true。
'multi_enabled' => env('SSO_MULTI_ENABLED', false),
在 .env 文件中
SSO_MULTI_ENABLED=true
当 multi_enabled
为 true 时,您可以使用多模式。
- 在
LoginController.php
中,您需要重写函数attemptLogin
protected function attemptLogin(Request $request) { $broker = new LaravelSSOBroker(); $credentials = $this->credentials($request); // this is your own field. $loginKey = $request->input('login_key', ''); return $broker->handleLogin($credentials[$this->username()], $credentials['password'], $loginKey); }
- 您的blade/js发送带有以下参数的请求
login_key //your login key
username //your login key value
password // your login key password
或者,您可以将 login_key
的名称更改为其他名称,例如 login_name
然后,您需要更改 attemptLogin
函数中 loginKey
的名称如下
protected function attemptLogin(Request $request) { $broker = new LaravelSSOBroker(); $credentials = $this->credentials($request); // this is your own field. $loginKey = $request->input('login_name', ''); return $broker->handleLogin($credentials[$this->username()], $credentials['password'], $loginKey); }
在 sso
中,它将发送如下请求
$this->userInfo = $this->makeRequest('POST', 'loginMulti', [ $key => $keyValue, 'password' => $password, 'key' => $key ]);
并且您自己的密钥 login_key
的值将用于认证。