lysice / laravel-sso
为 Laravel 提供简单的 PHP SSO 集成
Requires
- php: >=7.1.3
- guzzlehttp/guzzle: >=6.3
- laravel/framework: >=5.5
- lysice/php-simple-sso: ^1.2
README
本包基于 Simple PHP SSO 骨架 包,并进行了修改,使其适用于 Laravel 框架。
需求
- Laravel 5.5+
- PHP 7.1+
词汇含义
- SSO - 单点登录。
- 服务器 - 作为 SSO 服务器工作的页面,处理身份验证,存储所有会话数据。
- 代理 - 被客户/用户访问的页面。
- 客户/用户 - 您的每一位访客。
它是如何工作的?
客户访问代理,生成唯一的令牌。当生成新的令牌时,我们需要将客户会话附加到代理的会话中,以便他将被重定向到服务器,然后返回到代理。此时,在服务器中将创建新的会话,并将其与代理页面的客户会话关联起来。当客户访问其他代理时,将执行相同的步骤,除了当客户被重定向到服务器时,他已使用其旧会话和与代理 #1 关联的相同会话 ID。
在开始之前的一些提示
- 有时当您发送更多请求时会出现 429 错误。答案是,
api
中间件组使用了ThrottleRequests
中间件,别名为throttle
。您需要删除它或增加节流次数,如'throttle:600,1'
。 - 405 异常发生在执行 attach 之前执行 POST 或其他方法。在 1.7.6 版本中,您可以设置
attach
路由支持的方法。您可以在下面的laravel-sso.php
中这样做'supports' => [ 'attach' => [ 'GET' ], 'logout' => [ 'POST' ] ],
安装
服务器
使用 composer 安装此包。
$ composer require Lysice/laravel-sso
将配置文件复制到 Laravel 项目的 config/
文件夹。
$ php artisan vendor:publish --provider="Lysice\LaravelSSO\SSOServiceProvider"
创建一个表,其中将保存所有代理。
$ php artisan migrate --path=vendor/Lysice/laravel-sso/database/migrations
编辑您的 app/Http/Kernel.php
文件,通过从 api
中间件数组中删除节流中间件并添加会话中间件来编辑它。这是必要的,因为我们需要在 API 路由中使用会话,而节流中间件可能会阻止我们需要的连接。
'api' => [ 'bindings', \Illuminate\Session\Middleware\StartSession::class, ],
现在您应该创建代理。您可以使用以下 Artisan CLI 命令创建新的代理
$ php artisan sso:broker:create {name}
代理
使用 composer 安装此包。
$ composer require Lysice/laravel-sso
将配置文件复制到 Laravel 项目的 config/
文件夹。
$ php artisan vendor:publish --provider="Lysice\LaravelSSO\SSOServiceProvider"
将 config/laravel-sso.php
文件中的 type
值从 server
更改为 broker
。
在您的 .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
文件,将 \Lysice\LaravelSSO\Middleware\SSOAutoLogin::class
中间件添加到 web
中间件组。它应该看起来像这样
protected $middlewareGroups = [ 'web' => [ ... \Lysice\LaravelSSO\Middleware\SSOAutoLogin::class, ], 'api' => [ ... ], ];
最后但同样重要的是,您需要编辑 app/Http/Controllers/Auth/LoginController.php
。您应该在 LoginController
类中添加两个函数,这些函数将通过 SSO 服务器而不是代理页面来验证您的客户端。
protected function attemptLogin(Request $request) { $broker = new \Lysice\LaravelSSO\LaravelSSOBroker; $credentials = $this->credentials($request); return $broker->login($credentials[$this->username()], $credentials['password']); } public function logout(Request $request) { $broker = new \Lysice\LaravelSSO\LaravelSSOBroker; $broker->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
的配置文件laravel-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);
}
在 laravel-sso
中,它将发送如下请求
$this->userInfo = $this->makeRequest('POST', 'loginMulti', [
$key => $keyValue,
'password' => $password,
'key' => $key
]);
并且您自己的密钥 login_key
的值将用于身份验证。