Conexão Ao Twitter Usando O oAuth

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.

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.

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:

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:

code

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

Be Sociable, Share!

28 Comentários

  1. Quemuel,

    Coloquei seu exemplo dentro do meu site em http://imovelavenda.com.br/oauth/twitter/

    Tentei usa-lo, segui cada detalhe mas ainda deve faltar algo pois quando executo /oauth/twitter/index.php (do seu exemplo, configurado para mim) ele simplesmente mostra a minha index original e não acontece nada, nem solicita a autorização de conexão.

    A linha abaixo deve postar 'Teste de mensagem!', correto?
    $connection->post('statuses/update', array('status' => 'Teste de mensagem!'));

    Como posso apurar esse erro?

    Grato

  2. Sorry! Tudo ok! ;D

    Revisei tudo e percebi que tinha uma diretiva no meu .htaccess que redirecionava qualquer solicitação de index.html para nossa raiz. Alterei para home.html e ficou perfeito.

    Ahh, só achei um erro no arquivo twitteroauth.php na linha 138 que impossibilitou a execução mas era só um "*/" que você esqueceu de retirar.

    Só mais uma coisa, reparei que está em UTF-8 e tranca quando tem acentuação, como se faz para usar acentuação nos posts, suporta ISO-8859-1?

    Valeu pelo script!

  3. Roger Wolff

    Quemuel,

    Como posso fazer para postar texto com acentuação (ISO-8859-1)?

    Obrigado

  4. Olá Roger,

    Conforme conversamos hoje através do MSN, caso alguém tenha alguma dúvida, é só usar a função nativa do PHP utf8_encode()

    Obrigado pelo elogio postado no email.

    Abraço,

    Quemuel

  5. Olá, para todos.
    Criei um site em joomla e gostaria que as atualizações fossem publicadas no twitter utilizando a API do site encurtador de urls http://clipe.me
    Alguem poderia me ajudar a entender como utilizo?

    Obrigado pela ajuda.

    Paulo

  6. Opá! Até que enfim encontrei uma luz. Obrigado :D

  7. alex

    nao consegui listar todos os twits, veio todos as informações e o ultimo post.

  8. Como uso esse api para buscar uma palavra no twitter?

  9. Tentei utilizar o script para não conseguir logar. Dar erro interno no servidor

  10. Edson Luiz Siqueira

    Olá gostaria  de ter um exemplo de como seria este arquivo (html.inc),  agradeço …

  11. Joao

    Ola tudo blz? cara me ta dando o seu script um erro meto os dados no config e quando ponho a rodar no meu servidor aparece esta mensagem "Conexão ao Twitter não realizada. Atualize sua página ou tente novamente. " Amigo não é preciso meter o oauth_token e o oauth_token_secret?

  12. Bom Dia,
    Primeiramente, parabéns pelo post.
    Eu tenho uma dúvida, já consegui registrar uma nova aplicação, peguei os keys já inseri neste modelo, consigo me autenticar. agora gostaria de fazer uma simples consulta via .php que seria por exemplo quantos amigos tenho. Você tem como me dar alguma dica de como faço isso usando este modelo que você postou de autenticação ?

  13. Eu instalei a API configurei o Twitter exibe a tela de autorização de uso da App, mas não faz mais nada ele retorna ao arquivo connect.php e não faz mas nada, como posso ter certeza que a conexão foi fechada e qual um método para posta tweets?

  14. Gabriel

    Olá, fiz tudo conforme o tutorial, consegui conectar no Twitter, mas ele me gera um número de 7 dígitos, denominado PIN, e pede:

    "You've successfully granted access to dalcarobo.com!
    Simply return to dalcarobo.com and enter the following PIN to complete the process."

    O que faço com esse PIN?

  15. fel

    só não entendi onde eu consigo o OAUTH_CALLBACK os outros dois eu achei mas este não 

  16. Israel Guido

    Parabens to a tempos procurando algo que realmente funcione sobre essa Class OAuth, Esse foi o primeiro que conectou de verdade, se poder adiantar mais alguma coisa estarei de volta para estudo obrigado

  17. Opa!!! a timeline está sendo puxada no formato de texto. Como eu faço para deixar as URLs e Hashtags com link???? Abraço!

  18. "Could not connect to Twitter. Refresh the page or try again later. " como resolvo isso?

  19. Conexão ao Twitter não realizada. Atualize sua página ou tente novamente. ( como resolvo isso? coloquei td direito no arquivo config )

  20. Crystian

    Opa!!! Estou tentando implementar mas não to conseguindo, alguem poderia me ajudar? depois que eu logo com o twitter com a app… me retorna este erro.. não sei o que é que eu posso estar fazendo de errado!

    "Esta página da web tem um loop de redirecionamento" "Erro 310 (net::ERR_TOO_MANY_REDIRECTS): Houve muitos redirecionamentos."

    Alguem poderia me ajudar?

  21. daniellopesdiv

    Estou com uma dúvida.

    Vi que toda vez que eu tento logar com o Twitter tenho que clicar em "autorizar" e não simplesmente logar no twitter (como acontece com as autorizações de login via Facebook no qual é necessário autorizar apenas uma vez.)

    Você sabe se o Twitter é possivel fazer desta forma tb ? como ?

  22. Alexsander Talles

    Oi fiz o que falou tudo funcionando direito. La no twitter tem o meu aplicativo com o acesso aceito, mas na minha aplicação ainda fica pedindo toda hora para autorizar acesso. Isso é normal.

  23. Tem como alguém me dar uma luz?
    Eu já fui atrás em vários lugares e nada, nada funciona, preciso disso para sexta.
    Tem como alguém me ajudar?!

Participa! Comenta...