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

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

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

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

4

Решение

Шаг 1: Установите драйвер сеанса для общих данных сеанса

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

Шаг 2. Реализация междоменных идентификаторов сеансов

Идентификаторы сеанса передаются с помощью файлов cookie в Laravel. Поскольку ваши сайты находятся на разных доменах, cookie-файл сеанса не передается. Одним из способов решения этой проблемы является добавление их в строку запроса всех ваших запросов, например, так: domain2.tld /? Session_token = abcds2342

В вашем коде должен быть логин, который обнаруживает сеанс и затем запрашивает базу данных / кэш (ваш драйвер сеанса) для получения результата. Если результат найден, вы устанавливаете идентификатор сеанса вручную и запускаете сеанс:

session_id('abcds2342');
session_start();

Будьте внимательны, чтобы проверить как IP-адрес, так и идентификатор сеанса
чтобы люди не могли угадать кого-либо еще SessionID и, следовательно,
вход в систему как другой человек

Шаг 2А: Для этого вы можете реализовать пользовательское промежуточное ПО, которое переопределяет StartSession. Это промежуточное программное обеспечение должно переопределить getSession и, прежде чем проверять идентификатор сессии в 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;
}
}

Шаг 2БЗатем создайте пользовательский поставщик услуг для переопределения 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 и вместо этого используйте выше.

Шаг 2С: затем создайте свою модель App \ SessionShare для таблицы для хранения идентификаторов сеансов. Кроме того, приведенный выше код не заботится о проверке IP-адреса, поэтому вам придется добавить его, чтобы сделать его безопасным и предотвратить атаки методом перебора

Шаг 2D: Ох, и, наконец, не забудьте добавьте параметр get для session_token для всех ваших запросов

Обратите внимание, что приведенная выше реализация предназначена для драйвера сеанса базы данных. Конечно, вы можете сделать это и для драйвера кеша. Единственное, что могло бы измениться, — это реализация модели (шаг 2C) для проверки сеанса.

2

Другие решения

ты не можешь сделать это по-своему …

когда вы устанавливаете сеанс, в браузере устанавливается cookie для отслеживания сохраненного сеанса на стороне сервера.

если вы хотите разделить сеанс между двумя доменами, вы должны поделиться cookie между ботами сайта, но вы не можете этого сделать (вы можете сделать это только в поддоменах ОДНОГО домена)

но есть небольшой взлом
Самый простой обходной путь — передать информацию о входе в систему / учетные данные с веб-сайта A на веб-сайт B, и на веб-сайте B будет установлен отдельный файл cookie. Например, после входа на веб-сайт A их можно быстро перенаправить на веб-сайт B с зашифрованной строкой запроса. Веб-сайт B может затем прочитать информацию, установить собственный файл cookie и перенаправить пользователя обратно на сайт A.

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

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector