CakePHP 3: сессия уже началась с Hybridauth 3 - PullRequest
0 голосов
/ 07 мая 2018

У меня есть 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... :(
            }
        }
    }

}

Любая помощь, идеи, идеи о том, как с этим бороться, приветствуются!

1 Ответ

0 голосов
/ 07 мая 2018

Просто запустите сеанс CakePHP вручную перед использованием библиотеки Hybridauth, чтобы он выручил при проверке session_id() и забрал существующий сеанс.

Например, в вашем контроллере:

$this->getRequest()->getSession()->start();

// in CakePHP versions before 3.6/3.5
// $this->request->session()->start();
...