Hybrid Auth with Codeigniter
Asked Answered
N

2

7

I downloaded the codeigniter extension of HybridAuth here:

https://github.com/andacata/HybridIgniter

I followed instructions on its use. When I try to login via any provider at: www.mydomainname.com/hauth/login/twitter it loads a page saying:

HybridAuth
Open Source Social Sign On PHP Library. 
hybridauth.sourceforge.net/

It never works. I have valid API credentials for Twitter and Facebook but both load this page and nothing else happens. Any tips would be greatly appreciated.

UPDATE

My log says:

Hybrid_Provider_Adapter::login( facebook ), redirect the user to login_start URL. -- Array
(
    [hauth_return_to] => http://www.sitename.com/hauth/login/facebook
    [hauth_token] => 6vjglu8usmsjqsi74cku8o85j3
    [hauth_time] => 1335997302
    [login_start] => http://sitename.com/hauth/endpoint?hauth.start=facebook&hauth.time=1335997302
    [login_done] => http://sitename.com/hauth/endpoint?hauth.done=facebook
)

INFO -- 127.0.0.1 -- 2012-05-03T00:21:42+02:00 -- Enter Hybrid_Auth::redirect( http://sitename.com/hauth/endpoint?hauth.start=facebook&hauth.time=1335997302, PHP )

UPDATE

Here is a link to the controller

https://github.com/andacata/HybridIgniter/blob/master/application/controllers/hauth.php

Nag answered 2/5, 2012 at 22:25 Comment(4)
@Philip I updated the question with the logNag
can you post your controller .. and which version of CI you use ?Upholstery
@zaherg I updated the question with a link to the controllerNag
i have no idea, i have it installed on my computers and its working fine even with CI3.0dev but did you try it with yahoo for example ..Upholstery
U
2

here is my code which work 100% :

class Auth extends MX_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->template->set_layout('login');

    }

    //social login
    public function social($provider)
    {
        try{
            $this->load->library('HybridAuthLib');
            $this->load->model('auth_model');
            $serviceEnabled = $this->hybridauthlib->serviceEnabled($provider);
            if ($serviceEnabled)
            {

                $this->service = $this->hybridauthlib->authenticate($provider);
                if ($this->service->isUserConnected())
                {
                    $user_profile = $this->service->getUserProfile();
                    if($this->auth_model->count_user_by_uid($user_profile->identifier) === 0)
                    {
                        $this->session->set_flashdata('message','You Dont have account.. Create one.');
                        redirect('/users/register','refresh');
                    }
                    else
                    {
                        $dump_data = $this->auth_model->get_by(array('provider_uid'=>$user_profile->identifier));
                        $user = $this->ion_auth->user($dump_data->user_id)->row();

                        $session_data = array(
                            'identity'             => $user->{$this->config->item('identity', 'ion_auth')},
                            'username'             => $user->username,
                            'email'                => $user->email,
                            'user_id'              => $user->id, //everyone likes to overwrite id so we'll use user_id
                            'old_last_login'       => $user->last_login
                        );

                        $this->ion_auth->update_last_login($user->id);

                        $this->ion_auth->clear_login_attempts($this->config->item('identity', 'ion_auth'));

                        $this->session->set_userdata($session_data);

                        if ($this->config->item('remember_users', 'ion_auth'))
                        {
                            $this->ion_auth->remember_user($user->id);
                        }

                        $this->ion_auth->trigger_events(array('post_login', 'post_login_successful'));
                        $this->ion_auth->set_message('login_successful');
                        redirect('/','refresh');
                    }
                }
                else // Cannot authenticate user
                {
                    $this->session->set_flashdata('message','Cannot authenticate user');
                    redirect('/users/auth/login/','refresh');
                }

            }
            else // This service is not enabled.
            {
                $this->session->set_flashdata('message','This providers is not enabled.');
                redirect('/users/auth/login/','refresh');
            }
        }
        catch(Exception $e)
        {
            $error = 'Unexpected error';
            switch($e->getCode())
            {
                case 0 : $error = 'Unspecified error.'; break;
                case 1 : $error = 'Hybriauth configuration error.'; break;
                case 2 : $error = 'Provider not properly configured.'; break;
                case 3 : $error = 'Unknown or disabled provider.'; break;
                case 4 : $error = 'Missing provider application credentials.'; break;
                case 5 : log_message('debug', 'controllers.HAuth.login: Authentification failed. The user has canceled the authentication or the provider refused the connection.');
                         //redirect();
                         if (isset($service))
                         {
                            $service->logout();
                         }
                         $error = 'User has cancelled the authentication or the provider refused the connection.';
                         break;
                case 6 : $error = 'User profile request failed. Most likely the user is not connected to the provider and he should to authenticate again.';
                         break;
                case 7 : $error = 'User not connected to the provider.';
                         break;
            }

            if (isset($this->service))
            {
                $this->service->logout();
            }
            log_message('error', 'controllers.HAuth.login: '.$error);
            $this->session->set_flashdata('message', $error);
            redirect('/users/auth/login/', 'refresh');          
        }       

    }

    public function endpoint()
    {
        log_message('debug', 'controllers.HAuth.endpoint called.');
        log_message('info', 'controllers.HAuth.endpoint: $_REQUEST: '.print_r($_REQUEST, TRUE));

        if ($_SERVER['REQUEST_METHOD'] === 'GET')
        {
            log_message('debug', 'controllers.HAuth.endpoint: the request method is GET, copying REQUEST array into GET array.');
            $_GET = $_REQUEST;
        }

        log_message('debug', 'controllers.HAuth.endpoint: loading the original HybridAuth endpoint script.');
        require_once ADDONPATH.'/users/third_party/hybridauth/index.php'; //ADDONPATH is my modules path
    }
}

i hope that you can find it useful. am using the ion_auth for the main login system. the auth_model is a small model which check if the user has enabled this provider with name or not, since i want the user to have the same data even if he use another social network to login with ..

Upholstery answered 24/6, 2012 at 8:36 Comment(5)
sweet, I will test it when I get a chanceNag
how does the code fix the problem? I get this error when when i remove index.php usage from url path with htaccess and config.php.Whopper
@Whopper its working fine with me, so if its not working with you then you have to remember that each project has his own case ..Upholstery
There is no $this->load->model('auth_model'); please put this one.Posthaste
@SelVaa am not sure which version you are using, this is an old example back in 2012 so I think you should check the docs of codeigniter.Upholstery
W
4

the above answer didn't help much to me but i figured out the problem.

Add index.php to base_url in config/hybridauthlib.php

'base_url' => '/index.php/hauth/endpoint',
Whopper answered 7/9, 2012 at 17:15 Comment(4)
I found that had helped me to when debugging this issue.Nag
for me since am using MX_Moudles my base_url looks like this one 'base_url' => '/users/auth/endpoint',Upholstery
@Whopper How did you updates base_url? In my case when I add index.php in URL manually it works well but not by automaticChokedamp
@PlanetHackers sorry man, I did this a long time ago. Don't even remember what I was doing here.Whopper
U
2

here is my code which work 100% :

class Auth extends MX_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->template->set_layout('login');

    }

    //social login
    public function social($provider)
    {
        try{
            $this->load->library('HybridAuthLib');
            $this->load->model('auth_model');
            $serviceEnabled = $this->hybridauthlib->serviceEnabled($provider);
            if ($serviceEnabled)
            {

                $this->service = $this->hybridauthlib->authenticate($provider);
                if ($this->service->isUserConnected())
                {
                    $user_profile = $this->service->getUserProfile();
                    if($this->auth_model->count_user_by_uid($user_profile->identifier) === 0)
                    {
                        $this->session->set_flashdata('message','You Dont have account.. Create one.');
                        redirect('/users/register','refresh');
                    }
                    else
                    {
                        $dump_data = $this->auth_model->get_by(array('provider_uid'=>$user_profile->identifier));
                        $user = $this->ion_auth->user($dump_data->user_id)->row();

                        $session_data = array(
                            'identity'             => $user->{$this->config->item('identity', 'ion_auth')},
                            'username'             => $user->username,
                            'email'                => $user->email,
                            'user_id'              => $user->id, //everyone likes to overwrite id so we'll use user_id
                            'old_last_login'       => $user->last_login
                        );

                        $this->ion_auth->update_last_login($user->id);

                        $this->ion_auth->clear_login_attempts($this->config->item('identity', 'ion_auth'));

                        $this->session->set_userdata($session_data);

                        if ($this->config->item('remember_users', 'ion_auth'))
                        {
                            $this->ion_auth->remember_user($user->id);
                        }

                        $this->ion_auth->trigger_events(array('post_login', 'post_login_successful'));
                        $this->ion_auth->set_message('login_successful');
                        redirect('/','refresh');
                    }
                }
                else // Cannot authenticate user
                {
                    $this->session->set_flashdata('message','Cannot authenticate user');
                    redirect('/users/auth/login/','refresh');
                }

            }
            else // This service is not enabled.
            {
                $this->session->set_flashdata('message','This providers is not enabled.');
                redirect('/users/auth/login/','refresh');
            }
        }
        catch(Exception $e)
        {
            $error = 'Unexpected error';
            switch($e->getCode())
            {
                case 0 : $error = 'Unspecified error.'; break;
                case 1 : $error = 'Hybriauth configuration error.'; break;
                case 2 : $error = 'Provider not properly configured.'; break;
                case 3 : $error = 'Unknown or disabled provider.'; break;
                case 4 : $error = 'Missing provider application credentials.'; break;
                case 5 : log_message('debug', 'controllers.HAuth.login: Authentification failed. The user has canceled the authentication or the provider refused the connection.');
                         //redirect();
                         if (isset($service))
                         {
                            $service->logout();
                         }
                         $error = 'User has cancelled the authentication or the provider refused the connection.';
                         break;
                case 6 : $error = 'User profile request failed. Most likely the user is not connected to the provider and he should to authenticate again.';
                         break;
                case 7 : $error = 'User not connected to the provider.';
                         break;
            }

            if (isset($this->service))
            {
                $this->service->logout();
            }
            log_message('error', 'controllers.HAuth.login: '.$error);
            $this->session->set_flashdata('message', $error);
            redirect('/users/auth/login/', 'refresh');          
        }       

    }

    public function endpoint()
    {
        log_message('debug', 'controllers.HAuth.endpoint called.');
        log_message('info', 'controllers.HAuth.endpoint: $_REQUEST: '.print_r($_REQUEST, TRUE));

        if ($_SERVER['REQUEST_METHOD'] === 'GET')
        {
            log_message('debug', 'controllers.HAuth.endpoint: the request method is GET, copying REQUEST array into GET array.');
            $_GET = $_REQUEST;
        }

        log_message('debug', 'controllers.HAuth.endpoint: loading the original HybridAuth endpoint script.');
        require_once ADDONPATH.'/users/third_party/hybridauth/index.php'; //ADDONPATH is my modules path
    }
}

i hope that you can find it useful. am using the ion_auth for the main login system. the auth_model is a small model which check if the user has enabled this provider with name or not, since i want the user to have the same data even if he use another social network to login with ..

Upholstery answered 24/6, 2012 at 8:36 Comment(5)
sweet, I will test it when I get a chanceNag
how does the code fix the problem? I get this error when when i remove index.php usage from url path with htaccess and config.php.Whopper
@Whopper its working fine with me, so if its not working with you then you have to remember that each project has his own case ..Upholstery
There is no $this->load->model('auth_model'); please put this one.Posthaste
@SelVaa am not sure which version you are using, this is an old example back in 2012 so I think you should check the docs of codeigniter.Upholstery

© 2022 - 2024 — McMap. All rights reserved.