Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 单点登录(sso)laravel_Php_Laravel_Single Sign On_Saml - Fatal编程技术网

Php 单点登录(sso)laravel

Php 单点登录(sso)laravel,php,laravel,single-sign-on,saml,Php,Laravel,Single Sign On,Saml,我有三个不同的laravel网站,我想让用户登录一个网站,然后他将自动登录到其他两个网站。 如果您在您的open登录,那么您将使用StackOverflow帐户登录。 我尝试过很多软件包,但它们最终会出现无限的异常,或者根本不起作用。 大多数基于SAML的软件包,我不知道为什么它不适合我? 我不知道我想念什么? 有任何配置可以让它工作吗? 我正在使用laravel 5.6。所有应用都在同一台服务器上。 我尝试过许多基于SAML、OpenID和share session的解决方案,但它们都不适合我

我有三个不同的laravel网站,我想让用户登录一个网站,然后他将自动登录到其他两个网站。 如果您在您的open登录,那么您将使用StackOverflow帐户登录。 我尝试过很多软件包,但它们最终会出现无限的异常,或者根本不起作用。 大多数基于SAML的软件包,我不知道为什么它不适合我? 我不知道我想念什么? 有任何配置可以让它工作吗? 我正在使用laravel 5.6。所有应用都在同一台服务器上。

我尝试过许多基于SAML、OpenID和share session的解决方案,但它们都不适合我。 我不知道我是否错过了什么。 我试过了,但没有成功

这是我的密码

地点A

$site_b = 'http://s_sesstion_2.test/';
Route::get('/', function (Request $request) use ($site_b) {
    $session_id = Session::getId();
    try {
        $http = new Client();
        $response = $http->post($site_b . 'api/sessions/server', [
            'form_params' => [
                'session_id' => $session_id,
            ],
            'headers' => [
                'Accept' => 'application/json',
            ]
        ]);
    } catch (Exception $e) {
        dd($e->getMessage());
    }
    return view('welcome');
});
站点B(route/api.php)

站点B(route/web.php)


我只想在站点A登录,然后打开站点B我将登录我将接受任何实现该目的的解决方案

我在没有使用SAML的情况下实现了SSO解决方案。我将在这里分享我的解决方案,希望能有所帮助

单点登录 一个应用程序作为主身份验证服务器运行在
auth.domain
。其他应用程序运行在不同的域
app1.domain
app2.domain

每个用户都与SSO令牌链接。这些代币的到期时间非常短。所有身份验证过程(登录、重置密码、注册等)仅在
auth.domain
应用程序中发生

当用户访问任何应用程序时,例如,
app-1.domain

  • 将用户重定向到
    auth.domain/login
  • 如果用户以前登录过我们的系统,请继续执行步骤6
  • 显示登录表单,等待有效输入
  • 生成新的SSO令牌,过期时间小于3分钟
  • auth.domain
    记住我cookie附加到响应
  • 将重定向响应返回到
    app-1.domain/sso/{sso_token}
  • app-1.domain
    应用程序读取数据库。如果SSO令牌有效且未过期,请查找与该令牌关联的用户
  • app-1.domain
    使用
    Auth::login($user)
    方法对上一步中找到的用户进行身份验证
  • app-1.domain
    从数据库中清除收到的SSO令牌
  • 完成此步骤后,用户将通过
    app-1.domain
    的身份验证

    会话共享 所有共享会话变量都应保存到数据库中。我实现了一个新的会话驱动程序:

    • 保留共享会话变量名的列表
    • 读取/写入会话时,请检查会话变量的名称。如果该名称是上一个列表,则从数据库读取/写入该值。否则,请使用每个应用程序的专用会话

    如果两个应用程序共享相同的数据库,则可以采用以下方法:

    ->在数据库中,创建一个默认会话id,该id最初将标记为false

    ->现在,只要用户登录到任何一个站点,就生成一个新的哈希并用默认值替换它


    可选

    ->您还可以在浏览器本地存储上保存哈希,哈希作为键,null作为值


    ->现在,当用户登录/切换到任何站点时,请检查该散列 ->如果哈希值与默认值匹配,则显示登录页面,否则显示配置文件页面


    只有当您使用公共数据库登录时,我的答案才有效,否则您需要对此进行映射


    或者,您可以使用cookies存储哈希,并可以跨域访问它们。 可在以下网址找到示例:
    By@ludovic

    此网站是否共享数据库?@Kyslik是的,它们共享的数据库与您希望尝试解决方案并向我们展示您所尝试的相同。SSO是一个非常广泛的话题,有许多方法可以解决,我们不能仅仅猜测什么最适合您的情况。@apokryfos我尝试了许多基于SAML的软件包,但都不起作用,我尝试过分享会话,但没有成功。如果你不分享你尝试过的内容,我们不知道为什么事情没有成功,我指的是你尝试过的实际代码。很好的解决方案!您如何处理注销?当用户注销时,我将他们重定向到
    身份验证域/logout
    以清除公共会话,然后将他/她重定向回原始站点。您好@HieuLe,我可以在步骤4中知道,这是否意味着每当3分钟令牌过期时,我们都会遇到301重定向?或者我们可以通过http/ajax请求刷新令牌?我一直在尝试使用
    Auth::login($user)
    但是我得到
    BadMethodCallException:Method-Illumb\Auth\RequestGuard::loginUsingId不存在
    请看一看
        Route::post('/sessions/server', function (Request $request) {
        Storage::disk('local')->put('file.txt', $request->get('session_id'));
    });
    
        Route::get('/', function () {
        $session_id = Storage::disk('local')->get('file.txt');
        Session::setId($session_id);
        Session::start();
        //return Session::getId();// will return the same session id
        return \auth()->user();//this should return the auth user but it did not!!
    });