Complementando a matéria anterior que falamos sobre “conexão ao Twitter usando o PHP”, hoje vamos falar sobre a autenticação através do oAuth.
Todo programador, assim como os usuários sabem que a autenticação é uma das partes mais importantes no sistema. Se a autenticação não for perfeita, certamente trará prejuízos e vulnerabilidade ao seu Projeto!
Visando dar maior liberdade a seus usuários, sem esquecer de mantendo a segurança, vários Programadores e Administradores estão passando a usar oAuth em suas aplicações para conectar ao Twitter.
O Que É O oAuth?
É um script protodolo aberto (free) de segurança e autenticação que usa APIs.
Ele permite que usuários efetuem acessos ilimitados de seus web sites ao Twitter.
Como O oAuth É Usado?
O oAuth pode ser usado para acessar o Twitter por um curto período.
Exemplo:
Quando um usuário efetua login em uma página, seus dados são enviados através do método GET ao Twitter.
Antes de enviá-los o Sistema faz uma série de verificações, conferindo se os dados informados são realmente de uma conta válida do Twitter.
Criando Uma Conta No Twitter
Bem… nem precisamos dizer, né?
Se você pretende usar este código em suas aplicações, utilize uma conta válida do Twitter.
Bem… agora tratando-se do desenvolvedor:
Ao verificar nossa solução, você verá que para você ter acesso à solução “API” será necessário criar uma conta de desenvolvedor [4].
Como Encontrar O oAuth?
Como dissemos anteriormente, o oAuth é um script gratuito e pode ser facilmente encontrado na Internet.
Claro, assim como eu encontrei, você também encontrará muitos exemplos com falha na Internet, porém, mesmo que os diversos scripts funcionem corretamente, os originais através dos links a seguir:
- oAuth Web Site [5];
- PHP Library no Google Code [6].
OBS.: Desta página o único ficheiro que deveremos usar é o “OAuth.php”. Porém, sería ideal (até para conhecer outros recursos) verificar todas as páginas.
Conhecendo O Sistema
Abaixo e em anexo temos um sistema especial para seu uso.
Ele foi testado e aprovado, podendo ser usado por qualquer programador (após as configurações devidas).
Até para facilitar seu entendimento, vamos descrever cada ficheiro e expor os comentários dentro deles.
config.php
<?php
// SUAS CONFIGURAÇÕES DO TWITTER
define('CONSUMER_KEY', '');
define('CONSUMER_SECRET', '');
define('OAUTH_CALLBACK', '');
redirect.php:
<?php
session_start();
// Faz referência aos ficheiros twitteroauth.php e config.php
require_once('twitteroauth/twitteroauth.php');
require_once('config.php');
// Criao objeto TwitterOAuth com as credenciais do cliente
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
/* Get temporary credentials. */
$request_token = $connection->getRequestToken(OAUTH_CALLBACK);
// Salva as credenciais temporáriamente na sessão
$_SESSION['oauth_token'] = $token = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];
switch ($connection->http_code) {
case 200:
// Gera a autorização, autoriza a URL e redireciona o usuário para o Twitter
$url = $connection->getAuthorizeURL($token);
header('Location: ' . $url);
break;
default:
// Mostra uma notificação se o acesso ao Twitter der erro
echo 'Conexão ao Twitter não realizada. Atualize sua página ou tente novamente.';
}
connect.php:
<?php
// Trás os dados contidos no ficheiro config.php
require_once('config.php');
// Verifica se o Consumer Key e o Secret existem. Se não existirem, ele te dá a chance de criar um
if (CONSUMER_KEY === '' || CONSUMER_SECRET === '') {
echo 'Você precisa do <b>consumer key</b> e o <b>secret</b> para testar este código. Cadastre-se na página a seguir:<br><br>- <a href="https://twitter.com/apps">https://twitter.com/apps</a>';
exit;
}
// Gera uma imagem com link para o arquivo redirect.php
$content = '<a href="./redirect.php"><img src="./images/lighter.png" alt="Sign in with Twitter"/></a>';
// Inclui HTML nesta página
include('html.inc');
clearsessions.php:
<?php
session_start();
session_destroy();
// Após ter destruído a sessão anterior, redirecta para a página connect.php
header('Location: ./connect.php');
callback.php:
<?php
session_start();
// Trás a este ficheiro os ficheiros twitteroauth.php e config.php
require_once('twitteroauth/twitteroauth.php');
require_once('config.php');
// Se o oauth_token tiver expirado, redireciona para a página clearsessions.php
if (isset($_REQUEST['oauth_token']) && $_SESSION['oauth_token'] !== $_REQUEST['oauth_token']) {
$_SESSION['oauth_status'] = 'oldtoken';
header('Location: ./clearsessions.php');
}
// Criao objeto TwitterOAuth com as credenciais do cliente
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
// Pega validação de acesso ao Twitter
$access_token = $connection->getAccessToken($_REQUEST['oauth_verifier']);
// Salva o token de acesso. Caso você queira, pode salvar em uma base de dados para uso futuro.
$_SESSION['access_token'] = $access_token;
// Remove as informações do oauth_token
unset($_SESSION['oauth_token']);
unset($_SESSION['oauth_token_secret']);
// Se a resposta ao HTTP é 200 ele continua conectado
if (200 == $connection->http_code) {
// O usuário é verificado e o token de acesso é salvo para ser usado no futuro.
$_SESSION['status'] = 'verified';
header('Location: ./index.php');
} else {
header('Location: ./clearsessions.php');
}
index.php:
<?php
session_start();
// Trás a este ficheiro os ficheiros twitteroauth.php e config.php
require_once('twitteroauth/twitteroauth.php');
require_once('config.php');
// Se o oauth_token tiver expirado, redireciona para a página clearsessions.php
if (empty($_SESSION['access_token']) || empty($_SESSION['access_token']['oauth_token']) || empty($_SESSION['access_token']['oauth_token_secret'])) {
header('Location: ./clearsessions.php');
}
// Salva o token de acesso. Caso você queira, pode salvar em uma base de dados para uso futuro.
$access_token = $_SESSION['access_token'];
// Criao objeto TwitterOAuth com as credenciais do cliente
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);
// Se o método usado tiver correto ele muda a chamada API
$content = $connection->get('account/verify_credentials');
/* Alguns exemplos de chamada em Tela */
//$connection->get('users/show', array('screen_name' => 'Quemuel Aquino'));
//$connection->post('statuses/update', array('status' => date(DATE_RFC822)));
//$connection->post('statuses/destroy', array('id' => 5437877770));
//$connection->post('friendships/create', array('id' => 9436992));
//$connection->post('friendships/destroy', array('id' => 9436992));
// Inclui HTML na página
include('html.inc');
OBS.: Os 2 arquivos a seguir estarão dentro do diretório “twitteroauth”.
twitteroauth.php:
<?php
// Faz relacionamento com o ficheiro OAuth.php
require_once('OAuth.php');
class TwitterOAuth {
// Mostra o último status HTTP
public $http_code;
// Mostra a última API chamada
public $url;
// Mostra a URL APII
public $host = "https://api.twitter.com/1/";
// Tempo que o sistema permanece on
public $timeout = 30;
// Tempo em que a conexão expira
public $connecttimeout = 30;
// Verifica o Cert. SSL
public $ssl_verifypeer = FALSE;
// Formato
public $format = 'json';
// Retorna a data Decode do json
public $decode_json = TRUE;
// Retorna a última HTTP Header
public $http_info;
// Versão do Sistema
public $useragent = 'TwitterOAuth v0.2.0-beta2';
// URL das APIs
function accessTokenURL() { return 'https://api.twitter.com/oauth/access_token'; }
function authenticateURL() { return 'https://twitter.com/oauth/authenticate'; }
function authorizeURL() { return 'https://twitter.com/oauth/authorize'; }
function requestTokenURL() { return 'https://api.twitter.com/oauth/request_token'; }
function lastStatusCode() { return $this->http_status; }
function lastAPICall() { return $this->last_api_call; }
// Constrói o Objeto TwitterOAuth
function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {
$this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
$this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);
if (!empty($oauth_token) && !empty($oauth_token_secret)) {
$this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
} else {
$this->token = NULL;
}
}
// GET de request_token para o Twitter
function getRequestToken($oauth_callback = NULL) {
$parameters = array();
if (!empty($oauth_callback)) {
$parameters['oauth_callback'] = $oauth_callback;
}
$request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);
$token = OAuthUtil::parse_parameters($request);
$this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
return $token;
}
// Retorna string e autoriza a URL
function getAuthorizeURL($token, $sign_in_with_twitter = TRUE) {
if (is_array($token)) {
$token = $token['oauth_token'];
}
if (empty($sign_in_with_twitter)) {
return $this->authorizeURL() . "?oauth_token={$token}";
} else {
return $this->authenticateURL() . "?oauth_token={$token}";
}
}
function getAccessToken($oauth_verifier = FALSE) {
$parameters = array();
if (!empty($oauth_verifier)) {
$parameters['oauth_verifier'] = $oauth_verifier;
}
$request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);
$token = OAuthUtil::parse_parameters($request);
$this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
return $token;
}
function getXAuthToken($username, $password) {
$parameters = array();
$parameters['x_auth_username'] = $username;
$parameters['x_auth_password'] = $password;
$parameters['x_auth_mode'] = 'client_auth';
$request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters);
$token = OAuthUtil::parse_parameters($request);
$this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
return $token;
}
// GET do OAuthRequest
function get($url, $parameters = array()) {
$response = $this->oAuthRequest($url, 'GET', $parameters);
if ($this->format === 'json' && $this->decode_json) {
return json_decode($response);
}
return $response;
}
// POST do OAuthRequest
function post($url, $parameters = array()) {
$response = $this->oAuthRequest($url, 'POST', $parameters);
if ($this->format === 'json' && $this->decode_json) {
return json_decode($response);
}
return $response;
}
// Exclui a função oAuthRequest
function delete($url, $parameters = array()) {
$response = $this->oAuthRequest($url, 'DELETE', $parameters);
if ($this->format === 'json' && $this->decode_json) {
return json_decode($response);
}
return $response;
}
// Formata e acessa um OAuth / API
*/
function oAuthRequest($url, $method, $parameters) {
if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) {
$url = "{$this->host}{$url}.{$this->format}";
}
$request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
$request->sign_request($this->sha1_method, $this->consumer, $this->token);
switch ($method) {
case 'GET':
return $this->http($request->to_url(), 'GET');
default:
return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata());
}
}
// Retorna as informações do API
function http($url, $method, $postfields = NULL) {
$this->http_info = array();
$ci = curl_init();
/* Curl settings */
curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
curl_setopt($ci, CURLOPT_HEADER, FALSE);
switch ($method) {
case 'POST':
curl_setopt($ci, CURLOPT_POST, TRUE);
if (!empty($postfields)) {
curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
}
break;
case 'DELETE':
curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
if (!empty($postfields)) {
$url = "{$url}?{$postfields}";
}
}
curl_setopt($ci, CURLOPT_URL, $url);
$response = curl_exec($ci);
$this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
$this->http_info = array_merge($this->http_info, curl_getinfo($ci));
$this->url = $url;
curl_close ($ci);
return $response;
}
// Pega as informações do HEADER
function getHeader($ch, $header) {
$i = strpos($header, ':');
if (!empty($i)) {
$key = str_replace('-', '_', strtolower(substr($header, 0, $i)));
$value = trim(substr($header, $i + 2));
$this->http_header[$key] = $value;
}
return strlen($header);
}
}
oauth.php:
Bem… este é um exemplo simples de acesso. Você poderá melhorá-lo e adaptá-lo às suas reais necessidades…
Não se esqueça de verificar as observações (disponíveis em cada ficheiro) e efetuar seu cadastro no Twitter, senão ele não vai funcionar.
Faça seu teste e deixe aqui seu comentário…
Grande abraço.
Faça o download do código: Conexão Ao Twitter Usando O oAuth [7]