将cakephp的auth与hybridauth(oauth)结合起来

时间:2012-07-19 22:26:18

标签: php session cakephp oauth hybridauth

我想我只是在寻找关于如何使用cakephp 2.0在我的网站上设置用户+身份验证区域的一些指导。

我在UserController.php中设置了基本的登录和注册功能,其中还包含查找和显示其他用户的功​​能。

我还想使用hybridauth插件允许用户使用他们的社交媒体/ oauth帐户登录/注册(允许每个用户在数据库中使用多个社交帐户,以便同一个用户可以使用他们的Twitter或者facebook的详细信息,例如)。我目前只有3个提供者,所以我打算在我的用户数据库中创建6个列,并在同一个用户行中使用令牌和outhid。这是另一个控制器 - HybridauthController.php。

我设置了hybridauth,以便从帐户详细信息创建其'hybridauth'对象,这很好 - 但我希望能够将整个'身份验证'合并在一起,这样我的cakephp会话就包含了hybridauth会话数据(对象)创建我可以使用的一般“当前用户”数组,并在其中设置一些通用变量,具体取决于它们是否来自oauth。

我目前没有在数据库中存储会话,理想情况下我想允许所有人使用持久会话,无论他们是否使用oauth帐户。我真的不明白持久化会话应该如何与hybridauth一起工作,因为在这个例子中如何在用户第二天返回时填写$ current_user_id?肯定不是通过cookie吗?

http://hybridauth.sourceforge.net/userguide/HybridAuth_Sessions.html

总而言之,我正在寻找一种简单的解决方案,将我的所有'session'/'auth'/'user'数据合并到用户会话中的一个简单数组中。希望一切都有意义!

由于

1 个答案:

答案 0 :(得分:3)

迟到回答,但希望它能帮助你或其他人搜索。

我很难将HybridAuth集成到已经使用Cake Sessions和Auth组件的预先存在的CakePHP(1.3)应用程序中。我最初尝试使用从HybridAuth网站下载的Cake示例,但这对我不起作用。

我们已有的用户控制器已经有一堆逻辑,包括beforeFilter方法。这就是我插入session_start()而不是在HybridAuth Cake示例中的类声明之上的地方:

class UsersController extends AppController {
    ...
    var $components = array('Session','Auth','Email');
    ...
    public function beforeFilter(){
        // following two lines may not be necessary for your setup
        $this->Auth->allow('oauth', 'oauthLogout');
        $excludeBeforeFilter = array('oauth', 'oauthLogout');
        if ( ! in_array($this->action, $excludeBeforeFilter) ) {
            // preexisting Auth logic -- I had to bypass it because
            // calling `session_start` was messing up Cake's Auth
            ...
        } else {
            /* THIS IS NECCESSARY FOR HYBRIDAUTH (OAUTH) */
            /* setting the session ID made it so users could NOT log
               in from a 3rd party and our site */
            session_id($_COOKIE['CAKEPHP']);
            session_start();
        }
    }

    ...

    public function oauth($provider){
        $this->autoRender = false;
        // include HybridAuth
        require_once( WWW_ROOT . 'hybridauth/Hybrid/Auth.php' );

        try {
            // I stored my provider config in a Cake config file
            // It's essentially a copy from the site/Cake example
            $hybridAuth  = new Hybrid_Auth(Configure::read('HAuth.config'));
            $adapter     = $hybridAuth->authenticate($provider);
            $userProfile = $adapter->getUserProfile();

            // method on the User model to find or create the 3rd party user
            $user        = $this->User->findOrCreate($userProfile, $provider);

            if ( ! $user ) {
                echo 'Unable to find/create user';
            } else {
                // configure your fields as necessary
                $this->Auth->fields = array(...);
                $this->Auth->login($user);
            }
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }
}

此时,可以在Auth组件中访问第三方(HybridAuth)用户。这样,用户只登录了一个第三方服务或预先存在的登录(但不是两者)。

我还有一个问题是退出。为此,我基本上销毁了所有会话/ cookie以确保安全。在oauthLogout的{​​{1}}方法中:

UsersController

似乎超级hacky - 对不起。希望它有所帮助!

相关问题