Я создаю 2 проекта в двух разных доменах domain1.tld и domain2.tld.
Domain1.tld является главной страницей производителя событий, а domain2.tld является одним из его событий. Я хочу поделиться теми же сеансами (они фактически используют одну и ту же базу данных и один и тот же сервер Apache). Я попытался изменить драйвер сеанса на «базу данных» и создать таблицу сеанса, но ничего не происходит, если я зарегистрирую домен domain1.tld, ничего не происходит в domain2.tld.
Я действительно искал в сети, но я ничего не нашел
Шаг 1: Установите драйвер сеанса для данных совместного сеанса
Во-первых, установите ваш драйвер сеанса в базу данных или кеш, общий для обоих доменов. Ваш драйвер сеанса не может быть файлом
Шаг 2. Внедрение идентификаторов сеансов междоменного сеанса
Идентификаторы сеансов передаются с помощью файлов cookie в Laravel. Поскольку ваши веб-сайты находятся в разных доменах, cookie сеанса не переносится. Один из способов решить это – добавить их в строку запроса всех ваших запросов: domain2.tld /? Session_token = abcds2342
Внутри вашего кода должен быть некоторый логин, который определяет сеанс, а затем запрашивает базу данных / кеш (ваш драйвер сеанса) для результата. Если результат найден, вы устанавливаете идентификатор сеанса вручную и запускаете сеанс:
session_id('abcds2342'); session_start();
Будьте осторожны, чтобы проверить как IP-адрес, так и идентификатор сеанса, чтобы люди не угадали кого-либо из-за этого, SessionID и, таким образом, вошли в систему как другой человек
Шаг 2A : для этого вы можете реализовать собственное промежуточное программное обеспечение, которое отменяет StartSession . Это промежуточное программное обеспечение должно переопределять getSession и до того, как оно проверит session_id в cookie, проверьте, есть ли в запросе токен. Пример кода ниже:
<?php namespace App\Http\Middleware; use Illuminate\Session\Middleware\StartSession; use Illuminate\Http\Request; use App\SessionShare; use Closure; class StartSessionWithSharer extends StartSession { /** * Get the session implementation from the manager. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Session\SessionInterface */ public function getSession(Request $request) { $session = $this->manager->driver(); /** * Check if we can find a valid session token from saved records */ if($request->get('session_token') && !empty($request->get('session_token'))) { $sessionShare = SessionShare::valid()->whereToken($request->get('session_token'))->first(); if($sessionShare) $session_id = $sessionShare->session_id; } /** * Fallback to session in browser */ if(!isset($session_id) || !$session_id) $session_id = $request->cookies->get($session->getName()); $session->setId($session_id); return $session; } }
Шаг 2B : Затем создайте настраиваемого поставщика услуг, чтобы переопределить SessionServiceProvider следующим образом:
<?php namespace App\Providers; class CustomSessionServiceProvider extends \Illuminate\Session\SessionServiceProvider { /** * Register the service provider. * * @return void */ public function register() { $this->registerSessionManager(); $this->registerSessionDriver(); $this->app->singleton('App\Http\Middleware\StartSessionWithSharer'); } }
Затем удалите старый SessionServiceProvider из config / app.php и вместо этого используйте выше.
Шаг 2C: Затем создайте модель App \ SessionShare для таблицы для хранения идентификаторов сеанса. Кроме того, приведенный выше код не заботится о проверке IP-адреса, поэтому вам нужно будет добавить это, чтобы сделать его безопасным и предотвратить атаки грубой силы
Шаг 2D: О, и, наконец, не забудьте добавить параметр get для session_token для всех ваших запросов
Обратите внимание, что приведенная выше реализация предназначена для драйвера сеанса базы данных. Конечно, вы можете сделать это и для драйвера кэша. Единственное, что может измениться, это реализация модели (шаг 2C) для проверки сеанса
вы не можете сделать это по-своему …
когда вы устанавливаете сеанс, cookie устанавливается в браузере для отслеживаемой записи на стороне сервера.
если вы хотите поделиться сеансом между двумя доменами, вы должны делиться файлами cookie между сайтом-ботом, вы не можете этого сделать (вы можете сделать это только в поддоменах ОДНОГО домена)
но есть небольшой взлом: самый простой способ – передать информацию входа / учетной записи с веб-сайта A на веб-сайт B и создать веб-сайт B для отдельного файла cookie. Например, после входа в веб-сайт A вы могли бы быстро перенаправить их на веб-сайт B с зашифрованным запросом. Затем веб-сайт B мог прочитать информацию, установить свой собственный файл cookie и перенаправить пользователя обратно на сайт A.
Это грязно, но возможно.