объединение аутентификации Cakephp с гибридной аутентификацией (oauth)

Я полагаю, что мне просто нужно небольшое руководство о том, как настроить область «Пользователь + аутентификация» на моем веб-сайте с помощью cakephp 2.0.

У меня есть базовые функции входа и регистрации, настроенные в моем UserController.php, который также содержит функции для поиска и отображения других пользователей.

Я также хочу использовать плагин hybridauth, чтобы пользователи могли входить/регистрироваться, используя свою учетную запись в социальных сетях/oauth (что позволяет использовать более одной социальной учетной записи для каждого пользователя в базе данных, чтобы один и тот же пользователь мог использовать либо свои данные в Twitter, либо в Facebook). , Например). В настоящее время у меня есть только 3 провайдера, поэтому я планирую просто создать 6 столбцов в своей пользовательской базе данных с токеном и скрытым в одной пользовательской строке. Это в другом контроллере — HybridauthController.php.

У меня гибридная аутентификация настроена так, что она создает объект «гибридной аутентификации» из сведений об учетной записи, и это нормально, но я хочу иметь возможность объединить всю «аутентификацию» вместе, чтобы мой сеанс cakephp содержал данные сеанса гибридной аутентификации ( объект), создавая мой общий массив «текущий пользователь», который я могу использовать, и устанавливаю некоторые общие переменные внутри, в зависимости от того, получены ли они из oauth или нет.

В настоящее время я не храню сеансы в базе данных, и в идеале я хотел бы разрешить постоянные сеансы для всех, независимо от того, используют ли они учетную запись oauth или нет. Я действительно не понимаю, как постоянные сеансы должны работать с гибридной аутентификацией, потому что как в этом примере будет заполнен $current_user_id, когда пользователь вернется на следующий день? Не через куки, конечно?

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

Таким образом, я ищу простое решение для объединения всех моих данных «сеанса»/«авторизации»/«пользователя» в один простой массив в сеансе пользователей. Надеюсь, это все имеет смысл!

Спасибо


person Tim    schedule 19.07.2012    source источник


Ответы (1)


Поздно отвечать, но, надеюсь, это поможет вам или кому-то еще в поисках.

Мне было нелегко интегрировать HybridAuth в существовавшее ранее приложение CakePHP (1.3), которое уже использовало Cake Sessions и компонент Auth. Сначала я попытался использовать пример Cake, который я скачал с веб-сайта HybridAuth, но это не сработало для меня.

В нашем ранее существовавшем пользовательском контроллере уже была куча логики, включая метод beforeFilter. Вот где я вставил свой session_start(), в отличие от вышеприведенного объявления класса в примере с тортом HybridAuth:

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();
        }
    }
}

На данный момент сторонний пользователь (HybridAuth) доступен в компоненте аутентификации. Таким образом, пользователь был зарегистрирован только в одной сторонней службе или в ранее существовавшем логине (но не в обоих).

У меня тоже была проблема с выходом. Для этого я в основном уничтожил все сеансы / файлы cookie, чтобы быть в безопасности. В методе oauthLogout метода UsersController:

// probably overkill/paranoia
$this->Auth->logout();
$this->Session->destroy();
session_destroy($_COOKIE['CAKEPHP']);
/* these two seemed to make the difference 
   especially the 4th parameter */
setcookie( 'PHPSESSID', '', 1, '/' ); 
setcookie( 'CAKEPHP', '', 1, '/' );

Кажется супер хакерским - извините за это. Надеюсь, это поможет!

person doubleswirve    schedule 27.11.2012