Question

Salut, j'aimerais apprendre quelque chose à partir d'ici, en gros, je veux que l'accès à mon système se fasse dans le compte Google, d'une manière ou d'une autre, j'arrive à faire ce qui suit

  • obtenir l'identifiant client, rediriger l'uris, les clés secrètes
  • authentification depuis un compte Google
  • obtenir un jeton

mais j'avais l'impression que je faisais quelque chose de mal dans une certaine mesure, c'est le 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');
        }
    }

mais c'est mon contrôleur d'index le Login il n'y a qu'un bouton 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');


    }
}


quel serait le bon processus pour cela en utilisant MVC PHP, je dois faire le ff.:
UN.cliquez sur le bouton sign in to google
B.récupérez le jeton et enregistrez-le dans la session
C.utilisé le jeton sur l'ensemble de mon système (dans chaque contrôleur)

ce que j'ai en ce moment, c'est A & B mais le C, je ne sais absolument pas quoi faire.

Quelqu'un pourrait-il m'aider avec ça.tout commentaire de suggestion est bien apprécié.Merci d'avance.

Était-ce utile?

La solution

Le code que vous avez peut être un peu déroutant car il gère l'URL d'autorisation, la redirection vers Google, le rappel vers votre site et enregistre le jeton d'accès en même temps.

Lorsqu'il s'agit d'utiliser le jeton d'accès pour effectuer un appel authentifié à l'API, c'est beaucoup plus simple.Si vous disposez d'un jeton d'accès valide stocké dans votre session, vous pouvez vraiment l'utiliser n'importe où pour initialiser l'application Google, de cette façon :

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

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

Maintenant, si vous souhaitez que cela soit disponible sur plusieurs contrôleurs, le moyen le plus approprié dans CodeIgniter serait de créer une nouvelle bibliothèque encapsulant le code ci-dessus.

L'avantage d'utiliser une bibliothèque est qu'elle peut être chargée automatiquement dans la configuration CodeIgniter et est facilement accessible n'importe où dans votre code.

Exemple de bibliothèque :

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

?>

Il vous suffit ensuite de faire ceci pour l'utiliser dans votre contrôleur :

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

Vous pouvez également créer des raccourcis vers des API spécifiques.Par exemple, si vous souhaitez un accès rapide à l'API Google Analytics, vous pouvez procéder comme suit :

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

?>

Et puis utilisez-le de cette façon dans votre contrôleur :

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

En savoir plus sur les bibliothèques CodeIgniter :

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top