lysice/laravel-sso

为 Laravel 提供简单的 PHP SSO 集成

v1.7.8.14 2022-08-18 07:23 UTC

README

Latest Stable Version Total Downloads Latest Unstable Version License

本包基于 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_NAMESSO_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

多模式

您可以通过以下方式使用多模式

您必须使用最新版本才能使用此功能。

  • serverclient 的配置文件 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 的值将用于身份验证。

感谢这些公司的支持

https://JetBrains.com?from=laravel-sso