单点登录(sso)laravel

时间:2018-07-26 07:01:46

标签: php laravel single-sign-on saml

我有三个不同的laravel网站,我想让用户登录一个网站,然后他将自动登录到其他两个网站。 例如。如果您以stackoverflow登录,然后打开stackexchange,则将使用StackOverflow帐户登录。 我已经尝试了许多软件包,但是它们以无限的异常结尾,或者它们根本无法正常工作。 大多数基于SAML的软件包,我都不知道为什么它对我不起作用? 我不知道我想念什么? 是否有任何配置可以正常工作? 我正在使用laravel 5.6。所有应用程序都在同一服务器上。

我已经尝试了许多基于SAML,OpenID和共享会话的解决方案,但是所有解决方案都不适用于我。 我不知道我是否想念什么。 this is the last example我尝试了,但没有成功

这是我的代码

站点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)

    Route::post('/sessions/server', function (Request $request) {
    Storage::disk('local')->put('file.txt', $request->get('session_id'));
});

站点B(route / web.php)

    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!!
});

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

2 个答案:

答案 0 :(得分:5)

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

单点登录

一个应用程序在auth.domain上作为主身份验证服务器运行。其他应用程序在app1.domainapp2.domain,...

的不同域中运行

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

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

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

此步骤之后,用户将通过app-1.domain身份验证。

会话共享

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

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

答案 1 :(得分:1)

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

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

->现在,一旦用户登录到任何站点,就生成一个新的哈希并将其替换为默认值。


可选

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


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


仅当您使用公用数据库登录时,我的答案才有效,否则您需要为此映射。


或者,您可以使用cookie来存储哈希,并可以跨域访问它们。 可以在Cross-Domain Cookies上找到示例 通过@ludovic