biblioteca google-oauth trabalhando em sessão em MVC PHP
-
21-12-2019 - |
Pergunta
Olá gostaria de aprender uma coisa daqui, basicamente quero que o acesso do meu sistema seja na conta google de alguma forma consigo fazer o seguinte
- obter ID do cliente, redirecionar uris, chaves secretas
- autenticação da conta do Google
- obter token
mas eu senti que estava fazendo tudo errado em alguma parte, este é o 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');
}
}
mas este é o meu controlador de índice Login
só tem botão 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');
}
}
qual seria o processo certo disso usando MVC PHP preciso fazer o ff.:
A.clique no botão sign in to google
B.obtenha o token e salve-o na sessão
C.usei o token para todo o meu sistema (em todos os controladores)
o que tenho agora é A e B, mas o C não sei totalmente o que fazer.
Alguém poderia me ajudar com isso.qualquer comentário de sugestão será bem-vindo.desde já, obrigado.
Solução
O código que você tem pode ser um pouco confuso porque ele lida com o URL de autorização, redireciona para o Google, retorna a chamada para o seu site e salva o token de acesso ao mesmo tempo.
Quando se trata de usar o token de acesso para realizar chamadas autenticadas para a API, é muito mais simples.Se você tiver um token de acesso válido armazenado em sua sessão, poderá usá-lo em qualquer lugar para inicializar o aplicativo Google, desta forma:
// client
$client = new Google_Client();
$client->setApplicationName('Google Application');
$client->setClientId($clientId);
$client->setClientSecret($clientSecret);
$client->setRedirectUri($redirectUri);
// token
$client->setAccessToken($token);
Agora se você quiser que isso esteja disponível em vários controladores, a maneira mais apropriada no CodeIgniter seria criar uma nova biblioteca agrupando o código acima.
A vantagem de usar uma biblioteca é que elas podem ser carregadas automaticamente na configuração do CodeIgniter e são facilmente acessíveis em qualquer lugar do seu código.
Biblioteca de exemplo:
<?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);
}
}
?>
Então você só precisa fazer isso para usá-lo em seu controlador:
$this->load->library('someclass');
Você também pode criar atalhos para APIs específicas.Por exemplo, se você quiser um acesso rápido à API do Google Analytics, você pode fazer o seguinte:
<?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 então use desta forma no seu controlador:
$this->load->library('someclass');
$this->someclass->analytics();
Saiba mais sobre as bibliotecas CodeIgniter:
http://ellislab.com/codeigniter/user-guide/general/creating_libraries.html