Как я могу поделиться СЕССИЕЙ между фронтендом и сервером PHP? - PullRequest
0 голосов
/ 18 июня 2020

Я немного новичок в слабосвязанных методологиях, но я попробую. У меня есть бэкэнд-файл PHP, который получает и отвечает на запросы от внешнего интерфейса. Проблема в том, что интерфейс расположен по адресу https://servername.com, а серверная часть - http://localhost/backend.php

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

В настоящее время я использую curl для генерации запроса как такового:

$ch= curl_init();
curl_setopt($ch,CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['session_id'=>session_id()]));
curl_setopt($ch, CURLOPT_URL, 'http://localhost/backend.php');
$response = curl_exec($ch)

Et c. Я закрываю, возвращаю и так далее, но это никогда не работает. Каждый раз, когда я отправляю идентификатор сеанса и пытаюсь восстановить его на бэкэнде, время передачи истекает.

Восстановление не должно быть сложным в соответствии со всем, что я читаю:

if ($_REQUEST['session_id'])
   session_id($_REQUEST['session_id']);
session_start();

Но это не удается. Если я не отправлю идентификатор сеанса, связь работает, но у меня нет информации о сеансе на бэкэнде. Если я отправляю идентификатор, время ожидания истекает каждый раз.

ПРИМЕЧАНИЕ. Я пытался изменить URL-адрес CURL на https://localhost и имя сервера с помощью HTTPS, но затем я получаю сообщение об ошибке: запрошенный домен имя не соответствует сертификату сервера. Попытка использовать имя сервера без HTTPS дает ту же проблему с тайм-аутом, с которой я начал.

Ответы [ 2 ]

0 голосов
/ 24 июня 2020

В конце концов, единственное, что мне удалось найти, что работало, - это перенаправить вызовы сеанса PHP в мою БД. Я использовал это руководство: https://culttt.com/2013/02/04/how-to-save-php-sessions-to-a-database/

В нем объясняется, что класс сеанса PHP можно переопределить, чтобы он работал точно так же, как обычно, но на бэкэнде вы вместо этого повторно обращаясь к вашей БД. Таким образом, все, что вам нужно сделать, это отправить session_id с каждым запросом на бэкэнд и использовать session_id ($ the_id); на бэкэнде перед session_start (), и передняя, ​​и бэкэнд будут без проблем использовать один и тот же сеанс (вы можете получать и устанавливать переменные вперед и назад, как и следовало ожидать).

Абсолютно каждая моя попытка поделиться файлами cookie, подтянуть ту же сессию, эт c. с треском провалились. Возможно, это сработает с удаленными серверами, но я только моделировал бэкэнд для разделения переднего и бэкэнда на localhost.

0 голосов
/ 18 июня 2020

Значение session_id() на внешнем интерфейсе определяется внешним интерфейсом. session_id() на серверной части определяется серверной частью. Они не совпадают.

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

Есть 2 решения;

  1. Самое простое решение - убедиться, что бэкэнд и интерфейс находятся в одном домене (т.е. www.example.com и backend.example.com). Вы можете установить cook ie domain для сеанса cook ie на .example.com, поэтому оба будут использовать один и тот же идентификатор сеанса.

  2. В качестве альтернативы, клиенту необходимо отправить идентификатор сеанса серверной части во внешний интерфейс через браузер. Библиотека Jasny SSO делает это.

SSO workflow

Отказ от ответственности; Я автор Ясного ССО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...