novay/sso-client

Laravel的SSO集成

1.0.5 2021-04-22 08:39 UTC

This package is auto-updated.

Last update: 2024-09-22 16:55:56 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License

此包基于Simple PHP SSO骨架开发,专门为Laravel框架运行和使用而设计。

技术单点登录(简称SSO)是一种允许网络用户使用单个用户账户访问网络中应用程序的技术。这项技术特别受到大型和异构网络的欢迎(在系统操作和计算机使用的应用程序来自多个供应商,并且用户需要在要访问的不同平台上填写个人信息的情况下)。使用SSO后,用户只需要进行一次身份验证,即可获得访问网络中所有服务的权限。

需求

  • Laravel 5.5+
  • PHP 7.1+

如何工作?

客户端访问代理并生成唯一令牌。当生成新令牌时,我们需要将客户端会话附加到代理中的会话,这样客户端将被重定向到服务器并返回代理。此时,服务器将创建新的会话,并将其与代理页面中的客户端会话关联。当客户端访问其他代理时,将执行相同的步骤,除了当客户端被重定向到服务器时,他已经使用了旧的会话和与代理#1关联的相同会话ID。

flow

安装

1. 安装包

使用composer安装此包。

$ composer require novay/sso-client

此包将自动将服务提供者注册到您的应用程序中。

2. 发布供应商

运行以下命令将config sso.php文件复制到您的项目中的config/文件夹

$ php artisan vendor:publish --provider="Novay\SSO\Providers\SSOServiceProvider"

以下是被复制的配置文件的默认内容

//config/sso.php

return [
    'name' => 'Single Sign On - Broker (Client)', 
    'version' => '1.0.5', 

    /*
    |--------------------------------------------------------------------------
    | Redirect to ???
    |--------------------------------------------------------------------------
    | Arahkan kemana Anda akan tuju setelah login berhasil
    |
    */
    'redirect_to' => '/home', 

    /*
    |--------------------------------------------------------------------------
    | Konfigurasi auth.php
    |--------------------------------------------------------------------------
    | Pilih guard auth default yang dipakai
    |
    */
    'guard' => 'web', 

    /*
    |--------------------------------------------------------------------------
    | Pengaturan Umum untuk Broker
    |--------------------------------------------------------------------------
    | Beberapa parameter yang dibutuhkan untuk broker. Bisa ditemukan di
    | https://sso.samarindakota.go.id
    |
    */
    'server_url' => env('SSO_SERVER_URL', null),
    'broker_name' => env('SSO_BROKER_NAME', null),
    'broker_secret' => env('SSO_BROKER_SECRET', null),
    
    /*
    |--------------------------------------------------------------------------
    | Custom for UserList
    |--------------------------------------------------------------------------
    | Tentukan Model User yang dipakai
    |
    */
    'model' => '\App\Models\User'
];

3. 编辑环境

在您的.env文件中创建3个新选项

SSO_SERVER_URL=https://sso.samarindakota.go.id
SSO_BROKER_NAME=
SSO_BROKER_SECRET=

SSO_SERVER_URL包含SSO Samarinda的URI。 SSO_BROKER_NAMESSO_BROKER_SECRET必须根据您在https://sso.samarindakota.go.id注册的应用程序数据填写。

4. 注册中间件

编辑app/Http/Kernel.php文件,并将\Novay\SSO\Http\Middleware\SSOAutoLogin::class添加到web中间件组。例如:

protected $middlewareGroups = [
	'web' => [
		...
	    \Novay\SSO\Http\Middleware\SSOAutoLogin::class,
	],

	'api' => [
		...
	],
];

如果您在实现中想要对会话进行存储或对User模型进行操作,您也可以自定义提供的中间件。例如:

a) 创建新的中间件

$ php artisan make:middleware SSOAutoLogin

b) 将Default Middleware扩展到Custom Middleware

<?php

namespace App\Http\Middleware;

use Novay\SSO\Http\Middleware\SSOAutoLogin as Middleware;
use App\Models\User;

class SSOAutoLogin extends Middleware
{
    /**
     * Manage your users models as your default credentials
     *
     * @param Broker $response
     * @return \Illuminate\Http\RedirectResponse
     */
    public function handleLogin($response)
    {
        $user = User::updateOrCreate(['uid' => $response['data']['id']], [
            'name' => $response['data']['name'], 
            'email' => $response['data']['email'], 
            'password' => 'default', 
        ]);

        auth()->login($user);

        return;
    }
}

c) 编辑Kernel.php

protected $middlewareGroups = [
    'web' => [
        ...
        // \Novay\SSO\Http\Middleware\SSOAutoLogin::class,
        \App\Http\Middleware\SSOAutoLogin::class,
    ],

    'api' => [
        ...
    ],
];

5. 使用

a) 登录

<a href="{{ route('sso.authorize') }}">Login</a>

b) 登出

<a href="{{ route('sso.logout') }}">Logout</a>

c) 手动使用(可选)

对于手动使用,您可以将以下脚本片段插入到控制器类的登录和注销功能中。

protected function attemptLogin(Request $request)
{
    $broker = new \Novay\SSO\Services\Broker;
    
    $credentials = $this->credentials($request);
    return $broker->login($credentials['username'], $credentials['password']);
}

public function logout(Request $request)
{
    $broker = new \Novay\SSO\Services\Broker;
    $broker->logout();
    
    $this->guard()->logout();
    $request->session()->invalidate();
    
    return redirect('/');
}

d) 导入用户

<a href="{{ route('sso.import', 'Service') }}">Import</a>

此按钮用于拉取用户数据以进行用户数据初始化。以下是一些可用的类型:

  • 服务(特别为工作单位用户)
  • 访客(特别为居民用户)
  • 官员(特别为ASN或市政局员工用户)
  • 公司(特别为公司、基金会、机构、非政府组织用户)

接收到的请求如下所示

{
	...
	{
		'id' => 'UUID', 
		'name',  => 'Kecamatan Palaran', 
		'email',  => 'kec-palaran@samarindakota.go.id', 
		'type_id',  => 'None', 
		'number_id',  => 'XXX', 
		'jenis',  => 'Kecamatan', 
		'level' => 'Service', 
	}, 	
	...

}

接收到的响应如下所示

{
	'status' => 'success', 
        'message' => 'Daftar pengguna ('Service') berhasil diperbarui.', 
        'previous_url' => url()->previous()
}

如此。对于其他代理页面,您需要从头开始重复所有操作,只需更改配置文件中的代理名称和密钥即可。

.env文件的附加示例

SSO_SERVER_URL=https://sso.samarindakota.go.id
SSO_BROKER_NAME=Situsku
SSO_BROKER_SECRET=XXXXXXXXXXXXXXXX

版权

许可证

Samarinda SSO for Laravel 在MIT许可证下授权,适用于个人和商业产品。享受吧!