esyede/sso

适用于Laravel的简单PHP SSO软件包

v1.0.2 2023-05-11 14:03 UTC

This package is auto-updated.

Last update: 2024-09-13 17:30:35 UTC


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_NAMESSO_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

多模式

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

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

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