Intereting Posts
Настройка приветствия на основе времени пользователя (Доброе утро, добрый день …) Как передать выражение XPath как параметр XSL с помощью PHP? Ошибка при попытке использовать гибридный поток входа в Google OAuth 2.0 (Google_IO_Exception) с сообщением «Ошибка HTTP: невозможно подключиться:« 0 ») Вставка Div через DOMDocument в контент, полученный с удаленного сайта PHP setlocale не влияет PHP: Есть ли команда, которая может удалить содержимое файла без его открытия? Как войти в систему с помощью Curl и SSL и файлов cookie Regex удалить все строки строки только в тегах wordpress – Ошибка 403 файла javascript плагин wordpress HTTP_REFERER возвращается с NULL, ключ не существует в $ _SERVER Быстрее, лучше и более эффективный тип намека на PHP Storm с локаторами сервисов Что означают конструкции \ H, \ V и \ N? Как сохранять и извлекать данные, пригодные для контента mysqli_query () всегда возвращает true Библиотека поколения Heatmap для PHP

Laravel, 2 проекта в 2 доменах той же сессии

Я создаю 2 проекта в двух разных доменах domain1.tld и domain2.tld.

Domain1.tld является главной страницей производителя событий, а domain2.tld является одним из его событий. Я хочу поделиться теми же сеансами (они фактически используют одну и ту же базу данных и один и тот же сервер Apache). Я попытался изменить драйвер сеанса на «базу данных» и создать таблицу сеанса, но ничего не происходит, если я зарегистрирую домен domain1.tld, ничего не происходит в domain2.tld.

Я действительно искал в сети, но я ничего не нашел

Solutions Collecting From Web of "Laravel, 2 проекта в 2 доменах той же сессии"

Шаг 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.

Это грязно, но возможно.