Единый вход (sso) laravel

У меня есть три разных веб-сайта 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 26.07.2018 10:11

@Kyslik да, у них одна база данных

Moauya Meghari 26.07.2018 10:47

Ожидается, что вы попытаетесь найти решение и покажете нам, что вы пробовали. SSO - это действительно обширная тема, которую можно решить множеством разных способов, и мы не можем просто предположить, что лучше всего подойдет для вашего случая.

apokryfos 29.07.2018 09:59

@apokryfos Я пробовал много пакетов на основе SAML, и это не сработало, и я пытался поделиться сеансом, но тоже не сработало

Moauya Meghari 29.07.2018 10:51

Мы не сможем узнать, почему что-то не сработало, если вы не поделитесь тем, что пробовали, и под этим я имею в виду реальный код, который вы пробовали.

apokryfos 29.07.2018 11:00

@apokryfos Я добавил блоки кода из последнего пробного примера. и ссылка на проверенный ответ

Moauya Meghari 29.07.2018 11:10

@MoauyaMeghari - вы можете увидеть ответ stackoverflow.com/questions/51435654/… от @ n-b. Вы можете установить simplasamlphp или другую библиотеку saml 'lightsaml' и т. д.

Jaydp 30.07.2018 08:48
stackoverflow.com/a/40458694/4075877 это решение может помочь.
Gunnrryy 03.08.2018 15:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
14
8
8 849
2

Ответы 2

Я реализовал решение SSO без использования SAML. Я поделюсь своим решением здесь, надеюсь, оно поможет.

Единая точка входа

Одно приложение работает как главный сервер аутентификации на auth.domain. Другие приложения работают в разных доменах app1.domain, app2.domain, ...

Каждый пользователь связан с Токены SSO. Срок действия этих токенов очень короткий. Все процессы аутентификации (вход в систему, сброс паролей, регистрация, ...) происходят Только в приложении auth.domain.

Когда пользователь посещает какие-либо приложения, например app-1.domain:

  1. Перенаправить пользователя на auth.domain/login.
  2. Если пользователь ранее входил в нашу систему, продолжайте с шаг 6.
  3. Покажите форму входа, ожидая действительного ввода.
  4. Сгенерируйте новый Токен SSO со временем истечения менее 3 минут.
  5. Прикрепите к ответу файл cookie auth.domain «запомнить меня».
  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.

Совместное использование сеанса

Все общие переменные сеанса должны быть сохранены в базах данных. Я реализовал новый драйвер сеанса:

  • Сохраните список имен общих переменных сеанса
  • При чтении / записи в сеансы проверьте имя переменной сеанса. Если это имя является предыдущим списком, считайте / запишите значение из базы данных. В противном случае используйте частный сеанс каждого собственного приложения.

Хорошее решение! Как вы справляетесь с выходом из системы?

Phil795 10.12.2019 14:04

Когда пользователи выходят из системы, я перенаправляю их на auth.domain/logout, чтобы очистить общий сеанс, а затем перенаправляю его / ее обратно на исходный сайт.

Hieu Le 10.12.2019 15:25

Привет, @HieuLe, могу ли я узнать на Шаг 4, означает ли это, что мы будем сталкиваться с каждым перенаправлением 301 всякий раз, когда истечет 3-минутный токен? или мы можем сделать это по запросу http / ajax, чтобы обновить токен?

Mavichow 12.04.2020 16:07

Я пытался использовать Auth::login($user), но у меня появился BadMethodCallException: Method Illuminate\Auth\RequestGuard::loginUsingId does not exist, пожалуйста, посмотрите stackoverflow.com/questions/66465177/…

PHP User 04.03.2021 15:21

Если оба приложения используют одни и те же базы данных, вы можете использовать следующий подход:

-> В своей базе данных создайте идентификатор сеанса по умолчанию, который изначально будет помечен как ложный.

-> Теперь, как только пользователь войдет на любой из сайтов, сгенерируйте новый хэш и замените его значением по умолчанию.


по выбору

-> Вы также можете сохранить хэш в локальном хранилище браузера с хешем в качестве ключа и нулевым значением в качестве значения.


-> Теперь, когда пользователь входит / переключается на любой из сайтов, проверьте этот хеш -> Если хэш соответствует значению по умолчанию, показать страницу входа в систему, иначе отобразить страницу профиля.


Мой ответ действителен только в том случае, если вы используете общую базу данных для входа в систему, иначе для этого вам понадобится сопоставление.


В качестве альтернативы вы можете использовать файлы cookie для хранения хэшей и получать к ним доступ в междоменном режиме. Пример можно найти на Междоменные файлы cookie Автор @ludovic

Другие вопросы по теме