Pregunta

Hola me gustaría aprender algo de aquí, básicamente quiero que el acceso a mi sistema en la cuenta de google de alguna manera me las arreglo para hacer el siguiente

  • obtener el id de cliente, redirección uris, claves secretas
  • la autenticación de la cuenta de google
  • obtener token

pero yo sentí que me estaba haciendo mal todos en alguna parte, este es el Oauth2callback

class Oauth2callback extends CI_Controller {


    function __construct(){
        parent::__construct();

        $this->load->helper('url');
        $this->load->library('session');
        require_once APPPATH.'libraries/Google/Client.php';
        session_start();


    }

    public function index()
    {


        $client_id = $this->config->item('client_id');
        $client_secret = $this->config->item('client_secret');
        $redirect_uri = $this->config->item('redirect_uri');

        $client = new Google_Client();
        $client->setClientId($client_id);
        $client->setClientSecret($client_secret);
        $client->setRedirectUri($redirect_uri);
        $client->addScope("https://www.googleapis.com/auth/userinfo.email");
        $client->addScope("https://www.googleapis.com/auth/userinfo.profile");

        if (isset($_GET['code'])) {
            $client->authenticate($_GET['code']);
            $_SESSION['access_token'] = $client->getAccessToken();
            $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];

            header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
        }

        if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
            $client->setAccessToken($_SESSION['access_token']);
        } else {
            $authUrl = $client->createAuthUrl();
        }

        if ($client->getAccessToken()) {
            $_SESSION['access_token'] = $client->getAccessToken();


        }


        if(isset($authUrl)) {
            header('location:'. base_url());
        }else{
            header('location:'. base_url().'dashboard');
        }
    }

pero esta es mi índice de controlador de la Login que sólo tiene un botón sign in with Google

class Login extends CI_Controller {


    function __construct(){
        parent::__construct();

        $this->load->helper('url');
        $this->load->library('session');
        require_once APPPATH.'libraries/Google/Client.php';
        session_start();
    }

    public function index()
    {
        //$this->checkSession();
        $client_id = $this->config->item('client_id');
        $client_secret = $this->config->item('client_secret');
        $redirect_uri = $this->config->item('redirect_uri');

        $client = new Google_Client();
        $client->setClientId($client_id);
        $client->setClientSecret($client_secret);
        $client->setRedirectUri($redirect_uri);
        $client->addScope("https://www.googleapis.com/auth/userinfo.email");
        $client->addScope("https://www.googleapis.com/auth/userinfo.profile");

            $authUrl = $this->data['authUrl'] = $client->createAuthUrl();
            $this->load->view('login/index.php',$this->data);
            $this->load->view('template/pre_footer');
            $this->load->view('template/footer');


    }
}


¿cuál sería el proceso correcto de este uso de MVC en PHP necesito hacer el ff.:
A.haga clic en el botón sign in to google
B.obtener el token y guardarlo en la sesión
C.utiliza el token a mi de todo el sistema (en cada controlador)

lo que tengo ahora es Un & B, pero la C estoy totalmente de no saber qué hacer.

podría alguien ayudarme con esto.cualquier sugerencia comentario es bien apreciada.gracias de antemano.

¿Fue útil?

Solución

El código podría ser un poco confuso, porque se encarga de la autorización de url de redirección de Google, llamada de vuelta a su sitio, y guardar el token de acceso al mismo tiempo.

Cuando se trata de utilizar el token de acceso para realizar autenticada llamada a la api, es mucho más simple.Si usted tiene un token de acceso válido almacenados en tu sesión, realmente se puede utilizar en cualquier lugar para inicializar la Aplicación de Google, de esta manera:

// client
$client = new Google_Client();
$client->setApplicationName('Google Application');
$client->setClientId($clientId);
$client->setClientSecret($clientSecret);
$client->setRedirectUri($redirectUri);

// token
$client->setAccessToken($token);

Ahora bien, si queremos que esto sea disponible a través de varios controladores, la forma más adecuada de CodeIgniter sería crear una nueva biblioteca de envolver el código anterior.

La ventaja de utilizar una biblioteca es que se pueden auto-cargado en CodeIgniter config, y son fácilmente accesibles en cualquier parte del código.

Ejemplo de la biblioteca:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

    private $client;

    public function __construct()
    {
        ... 

        // client
        $client = new Google_Client();
        $this->client->setApplicationName('Google Application');
        $this->client->setClientId($clientId);
        $this->client->setClientSecret($clientSecret);
        $this->client->setRedirectUri($redirectUri);

        // token
        $this->client->setAccessToken($token);
    }
}

?>

A continuación, sólo tiene que hacer esto para usarlo en el controlador:

 $this->load->library('someclass');

También puede crear accesos directos a las APIs específicas.Por ejemplo, si desea un acceso rápido a la API de Google Analytics, puedes hacer esto:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

    private $client;

    public function __construct()
    {
        ... 

        // client
        $client = new Google_Client();
        $this->client->setApplicationName('Google Application');
        $this->client->setClientId($clientId);
        $this->client->setClientSecret($clientSecret);
        $this->client->setRedirectUri($redirectUri);

        // token
        $this->client->setAccessToken($token);
    }

    public function analytics()
    {
        return new Google_Service_Analytics($this->client);
    }
}

?>

Y, a continuación, utilizarlo de esta manera en el controlador:

 $this->load->library('someclass');
 $this->someclass->analytics();

Aprender más acerca de CodeIgniter bibliotecas:

http://ellislab.com/codeigniter/user-guide/general/creating_libraries.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top