Php 单点登录(sso)laravel
我有三个不同的laravel网站,我想让用户登录一个网站,然后他将自动登录到其他两个网站。 如果您在您的open登录,那么您将使用StackOverflow帐户登录。 我尝试过很多软件包,但它们最终会出现无限的异常,或者根本不起作用。 大多数基于SAML的软件包,我不知道为什么它不适合我? 我不知道我想念什么? 有任何配置可以让它工作吗? 我正在使用laravel 5.6。所有应用都在同一台服务器上。 我尝试过许多基于SAML、OpenID和share session的解决方案,但它们都不适合我。 我不知道我是否错过了什么。 我试过了,但没有成功 这是我的密码 地点APhp 单点登录(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的解决方案,但它们都不适合我
$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
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
的身份验证
会话共享
所有共享会话变量都应保存到数据库中。我实现了一个新的会话驱动程序:
- 保留共享会话变量名的列表
- 读取/写入会话时,请检查会话变量的名称。如果该名称是上一个列表,则从数据库读取/写入该值。否则,请使用每个应用程序的专用会话
可选 ->您还可以在浏览器本地存储上保存哈希,哈希作为键,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!!
});