How to use hybridauth plugin with CakePHP 3.x?

后端 未结 3 1937
悲&欢浪女
悲&欢浪女 2021-01-16 00:21

I use CakePHP 3.x to create a page can make a social sign in. I found HybridAuth plugin can do that. But, I can\'t understand about configuration and flow.

3条回答
  •  孤独总比滥情好
    2021-01-16 01:00

    First of all, I must thank my friend for helping me solve this mystery in cakephp 3.

    I'm providing the complete options how to use the plugin in cakephp 3 may this give a solution and explore more improvements in that plugin.

    Step 1: Run in composer

    php composer.phar require hybridauth/hybridauth:~2.5.0
    

    This must install plugin in the following path,

    /your-app-folder/vendor/hybridauth/..
    

    Step 2: Initialize the plugin.

    A. Modify the config.php file in the following folder,

    /your-app-folder/vendor/hybridauth/hybridauth/hybridauth/config.php
    

    to the required method, like add the app id and secret id, etc.

    $config = array(
                "base_url" => "http://localhost/your-app-folder/users/social_redirect/",//You have to change the above according to yours
    
                "providers" => array(
                    // openid providers
                    "OpenID" => array(
                        "enabled" => true
                    ),
                    "Yahoo" => array(
                        "enabled" => true,
                        "keys" => array("key" => "", "secret" => ""),
                    ),
                    "AOL" => array(
                        "enabled" => true
                    ),
                    "Google" => array(
                        "enabled" => true,
                        "keys" => array("id" => "", "secret" => ""),
                    ),
                    "Facebook" => array(
                        "enabled" => true,
                        "keys" => array("id" => "", "secret" => ""),
                        "scope" => "email, user_about_me, user_birthday, user_hometown",
                        "trustForwarded" => false
                    ),
                    "Twitter" => array(
                        "enabled" => true,
                        "keys" => array("key" => "", "secret" => "")
                    ),
                    // windows live
                    "Live" => array(
                        "enabled" => true,
                        "keys" => array("id" => "", "secret" => "")
                    ),
                    "LinkedIn" => array(
                        "enabled" => true,
                        "keys" => array("key" => "", "secret" => "")
                    ),
                    "Foursquare" => array(
                        "enabled" => true,
                        "keys" => array("id" => "", "secret" => "")
                    ),
                ),
                // If you want to enable logging, set 'debug_mode' to true.
                // You can also set it to
                // - "error" To log only error messages. Useful in production
                // - "info" To log info and error messages (ignore debug messages)
                "debug_mode" => false,
                // Path to file writable by the web server. Required if 'debug_mode' is not false
                "debug_file" => "",
    );
    

    Step 3: Now in yours users controller, (I have used users controller for http://localhost/your-app-folder/users/social - for my needs)

    Now your controller should look like this,

    Auth->allow(['register','social', 'social_redirect']);
        }
    
        public function index() {
            return $this->redirect(['controller' => 'Users', 'action' =>  'add']);
        }
    
        public function social($provider) {
    
        /* Include the Config File */
        require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'config.php');
        require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'Hybrid' . DS . 'Auth.php');
    
        /* Initiate Hybrid_Auth Function*/
        $hybridauth = new \Hybrid_Auth($config);
        $authProvider = $hybridauth->authenticate($provider);
        $user_profile = $authProvider->getUserProfile();
    
        /*Modify here as per you needs. This is for demo */
        if ($user_profile && isset($user_profile->identifier)) {
            echo "Name :" . $user_profile->displayName . "
    "; echo "Profile URL :" . $user_profile->profileURL . "
    "; echo "Image :" . $user_profile->photoURL . "
    "; echo "
    "; echo "Email :" . $user_profile->email . "
    "; echo "
    Logout"; } exit; /*Example Demo For FB authorize Action*/ #Facebook authorize if ($this->request->params['pass'][0] == 'Facebook') { if ($user_profile && isset($user_profile->identifier)) { $this->authorize_facebook($user_profile); } } } public function social_redirect() { $this->layout = false; $this->autoRender = false; require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'config.php'); require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'Hybrid' . DS . 'Auth.php'); require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'Hybrid' . DS . 'Endpoint.php'); $hybridauth = new \Hybrid_Auth($config); \Hybrid_Endpoint::process(); } public function authorize_facebook($user_profile) { $provider = "Facebook"; $provider_uid = $user_profile->identifier; $userExist = $this->Users->find('all')->where(['Users.provider' => $provider, 'Users.provider_uid' => $user_profile->identifier])->first(); if ((isset($userExist)) && ($userExist)) { $session = $this->request->session(); $session->delete('auth_sess_var'); $session->destroy(); $this->Auth->setUser($userExist->toArray()); $session->write('auth_sess_var', $userExist); return $this->redirect($this->Auth->redirectUrl()); } else { /* Create new user entity */ $user = $this->Users->newEntity(); $tmp_hash = md5(rand(0, 1000)); $tmp_id = time(); /* Save individual data */ $user->tmp_id = $tmp_id; $user->firstname = (!empty($user_profile->firstName)) ? $user_profile->firstName : ""; $user->lastname = (!empty($user_profile->lastName)) ? $user_profile->lastName : ""; $user->username = (!empty($user_profile->lastName) && !empty($user_profile->lastName)) ? strtolower($user_profile->firstName) . "." . strtolower($user_profile->lastName) : ""; $user->avatar = (!empty($user_profile->photoURL)) ? $user_profile->photoURL : ""; $user->role = "public"; $user->provider = $provider; $user->provider_uid = $user_profile->identifier; $user->gender = !empty($user_profile->gender) ? (($user_profile->gender == 'male') ? 'm' : 'f' ) : ""; $user->provider_email = !empty($user_profile->email) ? $user_profile->email : ""; $user->password = $user_profile->identifier; $user->confirm_password = $user_profile->identifier; $user->tmp_hash = $tmp_hash; $user->isverified = (!empty($user_profile->emailVerified)) ? 1 : 0; $user = $this->Users->patchEntity($user, $this->request->data); $this->Users->save($user); $userDetails = $this->Users->find('all')->where(['Users.provider' => $provider, 'Users.provider_uid' => $user_profile->identifier])->first(); /* Destroy previous session before setting new Session */ $session = $this->request->session(); $session->delete('auth_sess_var'); $session->destroy(); /* Set user */ $this->Auth->setUser($userDetails->toArray()); $session->write('auth_sess_var', $userDetails); return $this->redirect($this->Auth->redirectUrl()); } } }

    Note: Modify The Things according to your needs and design the table as per you requirement.

    Step 4

    Calling the hybrid auth:

    For Ex: Facebook
    

    for facebook login;

    Eureka. It will works like a charm.

    For more info comment here.

    Edit 2:

    Example Login Action (Default Auth Control)

    In App Controller,

    public function initialize() {
            parent::initialize();
            $this->loadComponent('Flash');
    
            /* Authentication */
            $this->loadComponent('Auth', [
                'authenticate' => [
                    'Form' => [
                        'fields' => [
                            'username' => 'email',
                            'password' => 'password'
                        ]
                    ]
                ],
                'loginRedirect' => [
                    'controller' => 'controller',
                    'action' => 'action'
                ],
                'logoutRedirect' => [
                    'controller' => 'Users',
                    'action' => 'login'
                ],
                'loginAction' => [
                    'controller' => 'Users',
                    'action' => 'login'
                ]
            ]);
    
        }
    

提交回复
热议问题