How to use hybridauth plugin with CakePHP 3.x?

后端 未结 3 1866
悲&欢浪女
悲&欢浪女 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,

    <?php 
    
    namespace App\Controller;
    
    use App\Controller\AppController;
    
    class UsersController extends AppController {
    
        public function beforeFilter(\Cake\Event\Event $event) {
          parent::beforeFilter($event);
          $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 "<b>Name</b> :" . $user_profile->displayName . "<br>";
            echo "<b>Profile URL</b> :" . $user_profile->profileURL . "<br>";
            echo "<b>Image</b> :" . $user_profile->photoURL . "<br> ";
            echo "<img src='" . $user_profile->photoURL . "'/><br>";
            echo "<b>Email</b> :" . $user_profile->email . "<br>";
            echo "<br> <a href='logout.php'>Logout</a>";
        }
        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: <a href="/users/social/Facebook">Facebook<a>
    

    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'
                ]
            ]);
    
        }
    
    0 讨论(0)
  • 2021-01-16 01:05

    Have you read this page yet? http://miftyisbored.com/complete-social-login-application-tutorial-cakephp-2-3-twitter-facebook-google/

    This would help you to put hybridauth into CakePHP 3.0, but you need to change some points in CakePHP3 way, like:

    // config/hybridauth.php
    
    return [
      'HybridAuth' => [
        'base_url' => 'URL here',
        'providers' => [
          'Twitter' => [...]
        ]
    ];
    

    and

    // src/Controller/Component/HybridauthComponent.php
    
    // App::import('Vendor', 'hybridauth/Hybrid/Auth');
    // $this->hybridauth = new Hybrid_Auth( $config );
    $this->hybridauth = new \Hybrid_Auth( $config );
    

    In addition, check this document.

    https://github.com/ADmad/CakePHP-HybridAuth/blob/master/README.md

    It says you need to initialize the Auth component, but it didn't work this way, so I put these options like this:

    // src/Controller/AppController.php
    
    public function initialize()
    {
      $this->loadComponent('Auth', [
        'authenticate' => [
          'ADmad/HybridAuth.HybridAuth'
        ],
        // redirect here if the user not authorized
        'loginAction' => [
          'controller' => 'User',
          'action' => 'login',
        ],
       ]);
    }
    
    0 讨论(0)
  • 2021-01-16 01:14

    i got error with these code and i repaired it with: error: Hybriauth config does not exist on the given path.

    solution: in users controller where you call(require) config.php

    require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'config.php');
    

    you need to store that what you require in variable $config:

    $config = require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'config.php');
    
    0 讨论(0)
提交回复
热议问题