我有一个LoginController,在那里我做我通常的登录操作与电子邮件地址和密码相关联的帐户。
我已经将我的杂交相关代码分离到一个名为OauthController的单独控制器中,在这里我有我所有的杂交魔法,以及我的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');
}
...这就是代码中那个信息被扔给我的地方。
现在,当我浏览杂交代码本身时,我发现如下:
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.');
}
}虽然CakePHP的部分阻止了我的工作,但他们都先打电话给session_start。
我试着从杂交中删除!session_start()检查,但是杂交不知道在哪里读出它需要阅读的内容。
因此,作为一个演示者,我正试图在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... :(
}
}
}
}任何关于如何处理这个问题的帮助、想法和见解都是受欢迎的!
发布于 2018-05-07 18:19:44
只需在使用CakePHP库之前手动启动Hybridauth会话,这样它就可以在session_id()检查时退出,并获取现有会话。
例如,在控制器中:
$this->getRequest()->getSession()->start();
// in CakePHP versions before 3.6/3.5
// $this->request->session()->start();https://stackoverflow.com/questions/50218515
复制相似问题