Сессия PHP не сохраняется после вызова curl

Мне нужно аутентифицировать моего пользователя с помощью скручивания

session_start(); $_POST["username"]= "user"; $_POST["password"]= "password"; $ch = curl_init(); $url = 'signin.php'; curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_POST, count($_POST)); curl_setopt($ch,CURLOPT_POSTFIELDS, $_POST); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $result = json_decode(curl_exec($ch),true); curl_close($ch); 

Signin.php делает другой вызов curl для api, я убедился, что signin.php возвращает всю необходимую информацию, устанавливает все необходимые переменные сеанса, возвращает массив:

 echo json_encode(array( 'success' => true, 'ALLSESSION' => $_SESSION, 'error'=> "" )); 

ALLSESSION возвращает правильные переменные сеанса, но они недоступны напрямую, я имею в виду, что я не могу использовать $ _SESSION ["userid"], его не существует в массиве сеансов.

Как сохранить сеанс между двумя страницами?

благодаря

Проблема заключается в том, что клиент не запоминает / не передает идентификатор сеанса PHP.

Когда HTTP-клиент делает запрос на php-скрипт (через HTTP-сервер), он должен включать идентификатор сеанса в запрос, если он хочет продолжить ранее начатый сеанс. Это можно сделать либо в заголовках HTTP, либо в виде файла cookie, либо в качестве параметра URL (по умолчанию – PHPSESSID ). Если вы не хотите использовать имя переменной сеанса PHP по умолчанию или если вы хотите использовать переменную POST вместо параметра URL, тогда вы можете использовать любую запрашиваемую переменную или параметр URL, который вы хотите (будь то GET, POST или COOKIE ), но тогда вам придется вручную интерпретировать эту переменную на стороне сервера.

Вот три решения, наиболее рекомендуемые по крайней мере рекомендуемые.

  1. Включите поддержку файлов cookie в cUrl или
  2. Передайте идентификатор сеанса как параметр URL или
  3. Передайте идентификатор сеанса как переменную запроса (post / cookie) или параметр URL, который не использует имя, ожидаемое PHP, а затем вручную запустите сеанс на стороне сервера, используя этот идентификатор сеанса.

Решение №1: включить поддержку файлов cookie в cUrl

PHP использует идентификатор сеанса в файле cookie для перезагрузки данных сеанса каждый раз, когда вы делаете запрос от этого клиента.

В этом случае клиент cUrl. Вам нужно настроить свой запрос cUrl, чтобы разрешить / использовать файлы cookie. Это делается путем установки параметров CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE .

 session_start(); $_POST["username"]= "user"; $_POST["password"]= "password"; $ch = curl_init(); $url = 'signin.php'; //Name of a file to store cookie data in. //If the file does not exist, it will be created. //cUrl (or your web server) needs to have write permissions to the folder. $cookieFile = "/some/writable/folder/filename"; curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_POST, count($_POST)); curl_setopt($ch,CURLOPT_POSTFIELDS, $_POST); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //Tell cUrl about the cookie file curl_setopt($ch,CURLOPT_COOKIEJAR, $cookieFile); //tell cUrl where to write cookie data curl_setopt($ch,CURLOPT_COOKIEFILE, $cookieFile); //tell cUrl where to read cookie data from $result = json_decode(curl_exec($ch),true); curl_close($ch); 

Любые последующие вызовы cUrl, которые используют $ cookieFile для CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE, будут иметь те же данные сеанса, что и предыдущие вызовы.

Решение №2: передать идентификатор сеанса в строке запроса URL, используя имя ожидаемого параметра (по умолчанию PHPSESSID, но это можно изменить)

Вы можете добавить идентификатор сеанса ко всем URL-адресам следующим образом: somepage.php? PHPSESSID = sessionidgoeshere

«PHPSESSID» – это имя переменной, которое по умолчанию используется в PHP. Если сервер настроен на использование имени, отличного от значения по умолчанию , вместо этого вам нужно будет использовать это имя переменной.

В решении # 2 вам все равно нужно будет хранить идентификатор сеанса на стороне клиента.

Решение №3: Передайте идентификатор сеанса как переменную запроса или параметр URL, а затем вручную запустите сеанс на стороне сервера, используя этот идентификатор сеанса.

Это решение не рекомендуется для нормальных ситуаций. В отличие от предыдущих решений, для этого требуется изменение сценария на стороне сервера, а также клиентская сторона (cUrl). Это решение полезно только в том случае, если вы специально хотите отправить идентификатор сеанса как нечто иное, чем параметр URL или файл cookie, или если вы хотите использовать имя переменной, отличное от имени, которое ожидает сервер. Поместите следующий код на свой серверный PHP, который обрабатывает запрос, перед началом сеанса : session_id($_POST[<param_name>]); или session_id($_GET[<param_name>]); или session_id($_COOKIE[<param_name>]);

Я предлагаю использовать Решение № 1, если у вас нет веской причины.

Кроме того, PHP не волнует, является ли запрос GET или POST или любым другим методом HTTP-запроса. Независимо от метода HTTP-запроса, если идентификатор сеанса передается как параметр URL или в файл cookie , соответствующий сеанс будет сохраняться на стороне сервера.