- Como Criar Um Site, Blog – WebMaster.pt - https://www.webmaster.pt -

Conexão Ao Twitter Usando O oAuth

Tweet [3]

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 [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:

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 [7]

Tweet [3]
Be Sociable, Share!
  • [8]
  • [9]
  • [10]
  • [11]
  • [12]