【发布时间】:2018-10-17 12:20:34
【问题描述】:
我有一个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的部分阻止了我。
我尝试从 Hybridauth 中删除 !session_start() 检查,但是 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... :(
}
}
}
}
欢迎任何有关如何处理此问题的帮助、想法和见解!
【问题讨论】:
标签: php cakephp hybridauth