У меня есть LoginController
, где я выполняю свою обычную операцию входа в систему с комбинацией адреса электронной почты и пароля, связанного с учетной записью.
Я разделил свой код, связанный с Hybridauth, на отдельный контроллер с именем OauthController
где у меня есть вся моя магия Hybridauth и где находится мой callback
/ endpoint
.
В OauthController
я проверяю, зарегистрирована ли уже электронная почта пользователя от указанного провайдера, и в любом случае я пытаюсьдля входа в систему этого пользователя с помощью $this->Auth->setUser(object)
.
Всякий раз, когда или как бы ни вызывался из $this->Auth
, я получаю ответ о том, что
Session was already started
У меня есть браузер через код CakePHP 3 инашел следующее утверждение в:
vendor/cakephp/cakephp/src/Network/Session.php (335)
public function start()
{
if ($this->_started) {
return true;
}
if ($this->_isCLI) {
$_SESSION = [];
$this->id('cli');
return $this->_started = true;
}
if (session_status() === \PHP_SESSION_ACTIVE) {
throw new RuntimeException('Session was already started');
}
...
И это тот код в коде, где это сообщение брошено в меня.
Теперь, когда я просматривалсам код Hybridauth я нашел в:
vendor/hybridauth/hybridauth/src/Storage/Session.php (46)
public function __construct()
{
if (session_id()) {
return;
}
if (headers_sent()) {
throw new RuntimeException('HTTP headers already sent to browser and Hybridauth won\'t be able to start/resume PHP session. To resolve this, session_start() must be called before outputing any data.');
}
if (! session_start()) {
throw new RuntimeException('PHP session failed to start.');
}
}
И оба они вызывают session_start
, один перед другим, хотя часть CakePHP блокирует меня.
У меня есть триубрав !session_start()
чек из Hybridauth, но тогда Hybridauth не знает, где считать, что ему нужно прочитать.
Итак, как демонстратор, я пытаюсь добиться этого в OauthController
:
<?php
namespace App\Controller;
use Hybridauth\Hybridauth;
class OauthController extends AppController
{
public function callback($provider)
{
try {
$hybridauth = new Hybridauth($config);
// additional mystery code
$hybridauth->authenticate();
if($everything_okay) {
$this->Auth->setUser($userObject); // and this is the point of failure
return $this->redirect('/account'); // and this never happends... :(
}
}
}
}
Любая помощь, идеи, идеи о том, как с этим бороться, приветствуются!