CakePHP 3:会议已经开始使用Hybridauth 3

时间:2018-05-07 16:18:18

标签: php cakephp hybridauth

我有一个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.');
    }
}

虽然CakePHP的部分阻止了我,但他们两个都在一个接一个地调用session_start

我试过从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... :(
            }
        }
    }

}

欢迎任何有关如何处理此问题的帮助,想法和见解!

1 个答案:

答案 0 :(得分:1)

在使用Hybridauth库之前,只需手动启动CakePHP会话,以便在session_id()检查时退出并获取现有会话。

例如在您的控制器中:

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

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