У меня есть три разных веб-сайта laravel, я хочу, чтобы пользователь входил в систему на одном веб-сайте, тогда он будет автоматически входить в систему на двух других веб-сайтах. например. если вы вошли в систему со своего переполнение стека, затем откройте stackexchange, вы войдете в систему с учетной записью StackOverflow. Я пробовал много пакетов, но они заканчиваются бесконечным количеством исключений или просто не работают. Большинство пакетов основано на SAML, я понятия не имею, почему он у меня не работал? Я не знаю, что мне не хватает? Есть ли какая-нибудь конфигурация, чтобы это работало? Я использую laravel 5.6. Все приложения находятся на одном сервере.
Я пробовал много решений на основе SAML, OpenID и сеанса общего доступа, но все они не работали со мной. Не знаю, упустил ли я что-нибудь. это последний пример Я пробовал и не получилось
это мой код
САЙТ А
$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 (маршрут / 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!!
});
Все, что я хочу, это войти в систему на сайт А, затем открыть сайт B Я буду авторизован. Я приму любое решение для достижения этой цели
@Kyslik да, у них одна база данных
Ожидается, что вы попытаетесь найти решение и покажете нам, что вы пробовали. SSO - это действительно обширная тема, которую можно решить множеством разных способов, и мы не можем просто предположить, что лучше всего подойдет для вашего случая.
@apokryfos Я пробовал много пакетов на основе SAML, и это не сработало, и я пытался поделиться сеансом, но тоже не сработало
Мы не сможем узнать, почему что-то не сработало, если вы не поделитесь тем, что пробовали, и под этим я имею в виду реальный код, который вы пробовали.
@apokryfos Я добавил блоки кода из последнего пробного примера. и ссылка на проверенный ответ
@MoauyaMeghari - вы можете увидеть ответ stackoverflow.com/questions/51435654/… от @ n-b. Вы можете установить simplasamlphp или другую библиотеку saml 'lightsaml' и т. д.






Я реализовал решение SSO без использования SAML. Я поделюсь своим решением здесь, надеюсь, оно поможет.
Одно приложение работает как главный сервер аутентификации на auth.domain. Другие приложения работают в разных доменах app1.domain, app2.domain, ...
Каждый пользователь связан с Токены SSO. Срок действия этих токенов очень короткий. Все процессы аутентификации (вход в систему, сброс паролей, регистрация, ...) происходят Только в приложении auth.domain.
Когда пользователь посещает какие-либо приложения, например app-1.domain:
auth.domain/login.auth.domain «запомнить меня».app-1.domain/sso/{sso_token}.app-1.domain считывает базу данных. Если Токен SSO действителен и не истекает, найдите пользователя, связанного с этим токеном.app-1.domain аутентифицирует пользователя, обнаруженного на предыдущем шаге, с помощью метода Auth::login($user).app-1.domain очищает полученный Токен SSO из базы данных.После этого шага пользователь аутентифицируется в app-1.domain.
Все общие переменные сеанса должны быть сохранены в базах данных. Я реализовал новый драйвер сеанса:
Хорошее решение! Как вы справляетесь с выходом из системы?
Когда пользователи выходят из системы, я перенаправляю их на auth.domain/logout, чтобы очистить общий сеанс, а затем перенаправляю его / ее обратно на исходный сайт.
Привет, @HieuLe, могу ли я узнать на Шаг 4, означает ли это, что мы будем сталкиваться с каждым перенаправлением 301 всякий раз, когда истечет 3-минутный токен? или мы можем сделать это по запросу http / ajax, чтобы обновить токен?
Я пытался использовать Auth::login($user), но у меня появился BadMethodCallException: Method Illuminate\Auth\RequestGuard::loginUsingId does not exist, пожалуйста, посмотрите stackoverflow.com/questions/66465177/…
Если оба приложения используют одни и те же базы данных, вы можете использовать следующий подход:
-> В своей базе данных создайте идентификатор сеанса по умолчанию, который изначально будет помечен как ложный.
-> Теперь, как только пользователь войдет на любой из сайтов, сгенерируйте новый хэш и замените его значением по умолчанию.
по выбору
-> Вы также можете сохранить хэш в локальном хранилище браузера с хешем в качестве ключа и нулевым значением в качестве значения.
-> Теперь, когда пользователь входит / переключается на любой из сайтов, проверьте этот хеш -> Если хэш соответствует значению по умолчанию, показать страницу входа в систему, иначе отобразить страницу профиля.
Мой ответ действителен только в том случае, если вы используете общую базу данных для входа в систему, иначе для этого вам понадобится сопоставление.
В качестве альтернативы вы можете использовать файлы cookie для хранения хэшей и получать к ним доступ в междоменном режиме. Пример можно найти на Междоменные файлы cookie Автор @ludovic
Есть ли у этого сайта общая база данных?