Domanda

ciao vorrei imparare qualcosa da qui, in pratica voglio che l'accesso del mio sistema sia in account Google in qualche modo riesco a fare il seguente

    .
  • Ottieni ID cliente, Redirect Uris, Secret Keys
  • Autenticazione da Google Account
  • Get token

Ma io ho sentito che stavo sbagliando tutto in qualche parte, questo è il 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');
        }
    }
.

Ma questo è il mio controller indice il Login ha solo il pulsante 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');


    }
}


Quale sarebbe il giusto processo di questo utilizzando MVC PHP Ho bisogno di fare il ff.:
. A. Fare clic sul pulsante sign in to google
B. Ottieni token e salvarlo in sessione
C. ha utilizzato il token al mio intero sistema (in ogni controller)

Quello che ho ora è A & B ma il c I Totalmente non sappia cosa fare.

Qualcuno potrebbe aiutarmi con questo.Qualsiasi commento di suggerimento è ben apprezzato.Grazie in anticipo.

È stato utile?

Soluzione

Il codice che hai potrebbe essere un po 'confuso perché gestisce URL di autorizzazione, reindirizzarsi a Google, richiamata al tuo sito e salva il token di accesso allo stesso tempo.

Quando si tratta di utilizzare il token di accesso per eseguire la chiamata autenticata all'API, è molto più semplice. Se hai un token di accesso valido memorizzato in sessione, puoi davvero usarlo ovunque per inizializzare l'applicazione di Google, in questo modo:

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

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

Ora se vuoi che questo sia disponibile in diversi controller, il modo più appropriato nel codice del codice sarebbe quello di creare una nuova libreria che avvolge il codice sopra.

Il vantaggio di utilizzare una libreria è che possono essere caricati automaticamente in Config Codeigniter e sono facilmente accessibili ovunque nel tuo codice.

Biblioteca di esempio:

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

?>
.

Allora devi solo farlo per usarlo nel tuo controller:

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

Potresti anche creare scorciatoie a specifiche API. Ad esempio, se volessi un rapido accesso a Google Analytics API, potresti farlo:

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

?>
.

e quindi usarlo in questo modo nel tuo controller:

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

Ulteriori informazioni sulle librerie di codice:

http://ellislab.com/Codeigniter/User-Guide/general/ creazione_library.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top