CURL и PHP сессионная аутентификация - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть приложение на https://app.example.com.Приложение требует от пользователей входа в систему;если они не вошли в систему, они перенаправляются на https://app.example.com/login.php при попытке доступа к любому URL-адресу в этом домене.

Когда пользователь успешно вошел в систему, приложение использует собственные сеансы PHP для поддержкисостояние входа в систему.

У нас есть отдельное приложение на https://db.example.com.Это было построено с CakePHP 3. Он настроен так, что пользователь не сможет получить доступ к любому URL-адресу в этом домене, если он не вошел в систему сначала через https://app.example.com.Это было сделано путем настройки session.cookie_domain на .example.com, а затем установив для файла cookie, используемого для сеансов, PHPSESSID:

// config/app.php on db.example.com
'Session' => [
    'defaults' => 'php',
    'cookie' => 'PHPSESSID',
    'timeout' => '0',
    'ini' => [
        'session.cookie_domain' => '.example.com',
        'session.cookie_httponly' => 'off'
    ]
];

В app.example.com включен db.example.com скрипт, который запускаетсяна каждый запрос.Это - в сочетании с возможностью считывать куки-файлы сеанса - означает, что мы проверяем, вошли ли пользователи в систему, прежде чем они смогут получить доступ к чему-либо в db.example.com;они перенаправляются на app.example.com/login.php, если нет.

До этого момента все работало нормально .

Проблема в том, что я пытаюсь сделать запрос CURL (для этого используется встроенная функциональность Cake: https://book.cakephp.org/3.0/en/core-libraries/httpclient.html) в части моего приложения на db.example.com на другой URL-адрес также на db.example.com, но для ответа используется перенаправление 302 на https://app.example.com/login.php.

Запрос выполняется от https://db.example.com/foo до https://db.example.com/bar - для этого также требуется параметр id в данных POST - например, так:

// Request made by /foo:
public function foo()
{
    $this->autoRender = false;

    $http = new Client();

    $response = $http->post('https://db.example.com/bar', [
        'id' => '12345'
    ]);

    debug($response);
}

Выводом выше является HTTP 302 с расположениемустановить на страницу входа в систему app.example.com:

object(Cake\Http\Client\Response) {
    [protected] code => (int) 302
    [protected] cookies => null
    [protected] reasonPhrase => 'Found'

// ...

'Set-Cookie' => [
    (int) 0 => 'PHPSESSID=g9aeqt2acol6av03rqul2puo20; path=/; domain=.example.com; secure'
    ],
'Location' => [
    (int) 0 => 'https://app.example.com/login.php'
    ], 

}

Я прочитал Поддержание сеанса с помощью Curl и PHP , но не вижу, что еще нужно настроить, чтобы решить эту проблему?

Я также не понимаю часть cookies => null отладочной информации, когда Set-Cookie имеет правильные данные сеанса / cookie / домена.

Сведения об окружении:

  • Оба app.example.com и db.example.com находятся на одном сервере.
  • Оба используют PHP 7.0.33
  • db.example.comиспользует CakePHP 3.5.13 в качестве основы;но app.example.com использует ванильный PHP (без фреймворка).
  • Веб-сервер Apache 2 / CentOS.

1 Ответ

0 голосов
/ 17 декабря 2018

HTTP-клиент не будет автоматически заполняться файлами cookie из приложения, в котором он запущен, или из любого другого состояния приложения в этом отношении, и, как упоминается @misorude в комментариях, ваш код не устанавливает файлы cookie дляклиент, следовательно, он не будет отправлять.

Вам нужно будет самостоятельно установить требуемый файл cookie сеанса, например, вот так для одного запроса:

$data = [
    'id' => '12345'
];
$config = [
    'cookies' => [
        //'PHPSESSID' => $this->request->getSession()->id() // before CakePHP 3.6
        'PHPSESSID' => $this->getRequest()->getSession()->id()
    ]
];
$response = $http->post('https://db.example.com/bar', $data, $config);

Предполагаемое cookies свойство пустого объекта ответа является «проблемой» отображения отладки, для этого класса нет настраиваемого отладочного вывода, поэтому используются значения по умолчанию PHP, которые будут включать защищенные свойства, такие как $cookies, которые, однако, не заполняются довы вызываете правильные методы для чтения куки, то есть getCookies(), getCookie(), getCookieData() или getCookieCollection().

См. также

...