我有三个不同的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 。我将登录。我将接受实现该目的的任何解决方案
答案 0 :(得分:5)
我在不使用SAML的情况下实现了SSO解决方案。我将在这里分享我的解决方案,希望对您有所帮助。
一个应用程序在auth.domain
上作为主身份验证服务器运行。其他应用程序在app1.domain
,app2.domain
,...
每个用户都与 SSO令牌相关联。这些令牌的到期时间非常短。所有身份验证过程(登录,重置密码,注册等)仅在auth.domain
应用中发生。
当用户访问任何应用程序时,例如app-1.domain
:
auth.domain/login
。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
身份验证。
所有共享的会话变量都应保存到数据库中。我实现了一个新的会话驱动程序:
答案 1 :(得分:1)
如果两个应用程序共享相同的数据库,则可以采用以下方法:
->在您的数据库中,创建一个默认会话ID,该会话ID最初将被标记为false
->现在,一旦用户登录到任何站点,就生成一个新的哈希并将其替换为默认值。
可选
->您还可以将哈希值保存在浏览器本地存储中,哈希值作为键,而null为值。
->现在,当用户登录/切换到任何站点时,请检查该哈希 ->如果哈希值与默认值匹配,则显示登录页面,否则显示配置文件页面。
仅当您使用公用数据库登录时,我的答案才有效,否则您需要为此映射。
或者,您可以使用cookie来存储哈希,并可以跨域访问它们。 可以在Cross-Domain Cookies上找到示例 通过@ludovic