У меня есть приложение на 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.