Библиотека Google-oauth, работающая в сеансе в MVC PHP
-
21-12-2019 - |
Вопрос
Привет, я хотел бы кое-что узнать отсюда, в основном я хочу, чтобы доступ к моей системе был в учетной записи 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