Autenticação e Autorização com a API do Twitter
O Twitter veio para ficar e isto eu não discuto e, este blog quando empolgado com o micro-blog público um exemplo simples de como utilizar o Twitter4j. Agora estou tentando mostrar uma forma mais avançada de comunicação com o Twitter, utilizando o modo de autenticação/autorização.
No exemplo anterior além de obter o Customer Key e Secret, você irá precisar do Usuário e Senha do Twitter, para assim obter a comunicação devida. Bem, nem todo mundo sente-se disposto a oferecer seus dados confidênciais para um software ou site qualquer. Portanto, este novo exemplo mostrará como você deve comunicar com o Twitter deixando a autenticação por parte do micro-blog e autorização por parte do próprio usuário.
Dando sequência ao assunto, inicialmente você precisará registrar uma aplicação no Twitter caso ainda não a tenha, guarde os dados Consumer Key e Secret. Existem dois tipos de aplicações a Client (Desktop) e Browser (Web), sendo que a segunda precisará de uma url que receberá o Token de autenticação.
Infelizmente, este post foi prejudicado pela falta de um web hosting que suporte Java, a Locaweb (atual host deste blog) cobra valores mensais absurdos, que inviabiliza blogs com intuito simplesmente acadêmico, como este, de realizar testes utilizando a linguagem Java.
Consegui descobrir lendo aqui, aqui e aqui que é possível configurar o seu localhost como Callback URL no Twitter, assim não será necessário ter um site publicado na internet para seus testes.
Web Autenticação
Durante o registro você irá informar o tipo de aplicação Browser e uma Callback URL, é para onde o navegador será redirecionado após a autorização do usuário. Já o campo Application Website, é a origem da sua aplicação web, ou seja, serão aceitas as chamadas feitas apenas a partir deste site.
O código abaixo irá fazer iniciar o processo de autenticação, o navegador vai ser redirecionado para a página de login do Twitter.
final String CALLBACK_URL = "http://127.0.0.1:8080/BlogTwitt4u/"; // a mesma configurada na aplicação
final String CUSTOMER_KEY = "6MWotGxvuNVGfK4lDqAqhg";
final String CUSTOMER_SEC = "oRH0YviLum2Rrii25ePj0DEk6VnmNjoTG0ESUpqSY";
OAuthConsumer consumer = new DefaultOAuthConsumer(CUSTOMER_KEY, CUSTOMER_SEC);
OAuthProvider provider = new DefaultOAuthProvider( "https://twitter.com/oauth/request_token",
"https://twitter.com/oauth/access_token",
"https://twitter.com/oauth/authorize" );
//
// Solicita a autorização
//
String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);
session.setAttribute("token", consumer.getToken());
session.setAttribute("tokenSecret", consumer.getTokenSecret());
//
//
// Redireciona para o Twitter solicitar o Usuário e Senha, e Autorização para a aplicação
// Em seguida será redirecionado para a callback url
response.sendRedirect(authUrl);
Após fazer o login e autorizar a sua aplicação, o navegador será redirecionado novamente para o seu site, com dois parâmetros preenchidos, como esta abaixo:
http://127.0.0.1:8080/BlogTwitt4u/?oauth_token=RQVPENBxDbQuI1bJ1rjELuVSyZhMYqr8Fcs5eqyZw&oauth_verifier=a8FuEeitfdCR2IfgisfsHopMAUevs4cDyRWkbZz4
Pronto, ai você já pode colher as informações que desejar, veja:
if( oauthVerifier!=null && !oauthVerifier.trim().equals("") ){
String token = (String) session.getAttribute("token");
String tokenSecret = (String) session.getAttribute("tokenSecret");
//
consumer.setTokenWithSecret(token, tokenSecret);
//
//
provider.setOAuth10a(true);
provider.retrieveAccessToken(consumer, oauthVerifier);
out.println("<h1>AUTORIZADO!</h1>");
out.println("<pre>");
out.println("token:\t\t" + consumer.getToken());
out.println("tokenSecret:\t\t" + consumer.getTokenSecret());
out.println("oauthVerifier:\t\t" + oauthVerifier);
out.println("oauthToken:\t\t" + oauthToken);
//
//
URL url = new URL("http://twitter.com/statuses/mentions.json");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
consumer.sign( urlConnection );
urlConnection.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()) );
String inputLine = "";
String content = "";
while ((inputLine = in.readLine()) != null){
content += inputLine;
}// while end
in.close();
int statusCode = urlConnection.getResponseCode();
out.println("statusCode: " + statusCode);
out.println("</pre>");
JSONArray json = JSONArray.fromObject( content );
out.println("<hr>");
out.println("<h3>Mentions</h3>");
out.println("<pre>");
for(int i=0; i<json.size(); i++){
JSONObject obj = (JSONObject) json.get(i);
if( obj!=null ){
// JSONString str = (JSONString) obj.get("text");
out.println(obj.getString("text"));
}
}// for end
out.println("</pre>");
}
Desktop Autenticação
Este é um exemplo comum, muito conhecido em qualquer pesquisa no Google, para utiliza-lo você deve ter uma aplicação do tipo Client.
O código pede para que o usuário abra o navegador, acesse uma determinada URL e depois informe o código númerico no programa, nada eficaz né? Muitos programadores utilizam uma maneira nada elegante que é a de “hackear” esta página e pegar o código automáticamente, facilitando a vida de todo mundo. Faça isto por sua conta e risco. Perceba que quando comparado ao código de autenticação Web a única mudança é a utilização do código PIN, que não necessário informar na web.
<pre>
<pre><pre>// Lembre-se de modificar estes valores para os seus
//
final String CUSTOMER_KEY = "6MWotGxvuNVGfK4lDq";
final String CUSTOMER_SEC = "oRH0YviLum2Rrii25ePj0DEk6VnmNjoTG0ESUp";
try {
HttpURLConnection request = null;
URL url = null;
OAuthConsumer consumer = new DefaultOAuthConsumer(CUSTOMER_KEY, CUSTOMER_SEC);
OAuthProvider provider = new DefaultOAuthProvider( <a href="https://twitter.com/oauth/request_token">https://twitter.com/oauth/request_token</a>,
"https://twitter.com/oauth/access_token",
"https://twitter.com/oauth/authorize");
String authUrl = provider.retrieveRequestToken(consumer, OAuth.OUT_OF_BAND);
//
// URL Que irá retornar o PIN, necessário para formar o Token
System.out.println(authUrl);
String pinCode = JOptionPane.showInputDialog("Acesse o endereço:\n" + authUrl + "\nE Informe o PIN:");
System.out.println("PIN Code: " + pinCode);
//
provider.retrieveAccessToken(consumer, pinCode);
String tokenKey = consumer.getToken();
String tokenSec = consumer.getTokenSecret();
System.out.println("Token Key : " + tokenKey);
System.out.println("Token Sec : " + tokenSec);
consumer.setTokenWithSecret(tokenKey, tokenSec);
url = new URL(<a href="http://twitter.com/statuses/mentions.xml">http://twitter.com/statuses/mentions.xml</a>);
request = (HttpURLConnection) url.openConnection();
// sign the request
consumer.sign(request);
// send the request
request.connect();
// response status should be 200 OK
int statusCode = request.getResponseCode();
System.out.println("Status Code : " + statusCode);
} catch (OAuthMessageSignerException e) {
e.printStackTrace();
} catch (OAuthNotAuthorizedException e) {
e.printStackTrace();
} catch (OAuthExpectationFailedException e) {
e.printStackTrace();
} catch (OAuthCommunicationException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Foram utilizadas as seguintes bibliotecas:
Apache Commons BeansUtil 1.8
Apache Commons Codec 1.4
Apache Http Client 3.1
Apache Commons Lang 2.4
ezmorph 1.0.6
json-lib 2.3
Faça download do projeto, que contêm ambos exemplos de autenticação.