Вопрос

Привет, я хотел бы кое-что узнать отсюда, в основном я хочу, чтобы доступ к моей системе был в учетной записи Google, каким-то образом мне удается сделать следующее

  • получить идентификатор клиента, перенаправить URIS, секретные ключи
  • аутентификация из аккаунта Google
  • получить токен

но я чувствовал, что в какой-то части я все делаю неправильно, вот в чем дело 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');
        }
    }

но это мой контроллер индекса Login у него есть только кнопка 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');


    }
}


каким будет правильный процесс с использованием MVC PHP? Мне нужно сделать ff.:
А.нажмите кнопку sign in to google
Б.получить токен и сохранить его в сеансе
С.использовал токен для всей моей системы (в каждом контроллере)

сейчас у меня есть A и B, но C я совершенно не знаю, что делать.

может ли кто-нибудь помочь мне с этим.любые предложения и комментарии приветствуются.заранее спасибо.

Это было полезно?

Решение

Код, который у вас есть, может быть немного запутанным, поскольку он обрабатывает URL-адрес авторизации, перенаправление в Google, обратный вызов на ваш сайт и одновременно сохраняет токен доступа.

Когда дело доходит до использования токена доступа для выполнения аутентифицированного вызова API, все гораздо проще.Если у вас есть действительный токен доступа, хранящийся в вашем сеансе, вы действительно можете использовать его где угодно для инициализации приложения Google следующим образом:

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

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

Теперь, если вы хотите, чтобы это было доступно на нескольких контроллерах, наиболее подходящим способом в CodeIgniter будет создание новой библиотеки, обертывающей приведенный выше код.

Преимущество использования библиотеки заключается в том, что они могут автоматически загружаться в конфигурации CodeIgniter и легко доступны в любом месте вашего кода.

Пример библиотеки:

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

?>

Тогда вам просто нужно сделать это, чтобы использовать его в своем контроллере:

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

Вы также можете создать ярлыки для определенных API.Например, если вам нужен быстрый доступ к API Google Analytics, вы можете сделать это:

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

?>

А затем используйте его в своем контроллере следующим образом:

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

Узнайте больше о библиотеках CodeIgniter:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top