APIs e Microsserviços

25 out, 2011

App do Facebook com Rails, usando o Koala

Publicidade

Para saber mais sobre como desenvolver aplicativos para o Facebook usando o lado do servidor, eu escolhi o Koala para Rails. Para .NET, o Facebook C# SDK tem um bom suporte, também dado pela Microsoft. Neste artigo, vou explicar como usar o Koala em seus aplicativos Rails. Como qualquer aplicativo do Facebook, os pré-requisitos são:

  • Uma conta do Facebook (mas você já deve fazer parte dessa parte da população mundial);
  • Um aplicativo do Facebook (que pode estar no modo sandbox), de modo que você deve ter um App ID, App Secret e Callback URL;
  • Um aplicativo Rails na sua máquina local e o aplicativo do Facebook apontado para ela como http://localhost:3000 (porta default para  Mongrel, ou WEBrick)

Instalando o Koala

Instale o Koala gem a partir deste link, usando o sudo gem install koala –pre

Configurando o Koala

Crie o facebook.yml in /config com o seguinte conteúdo:

# config/facebook.yml
development:
app_id: 184xxxxxxxxxxxx
secret_key: 80xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
callback_url: http://localhost:3000/
test:
...
production:
...

Adicione o código a seguir em config/environment.rb:

# config/environment.rb
# in Rails::Initializer.run do |config|
config.action_controller.allow_forgery_protection = false
config.gem "koala"

A primeira linha habilita o callback do Facebook para o seu servidor. A linha seguinte adiciona o koala gem dentro desta aplicação.

Crie o koala.rb in /config/initializers com o seguinte conteúdo:

# config/initializers/koala.rb

module Facebook
CONFIG = YAML.load_file(Rails.root + "/config/facebook.yml")[Rails.env]
APP_ID = CONFIG['app_id']
SECRET = CONFIG['secret_key']
CALLBACK_URL = CONFIG['callback_url']
end

Koala::Facebook::OAuth.class_eval do
def initialize_with_default_settings(*args)
case args.size
when 0, 1
raise "application id and/or secret are not specified in the config" unless Facebook::APP_ID && Facebook::SECRET
initialize_without_default_settings(Facebook::APP_ID.to_s, Facebook::SECRET.to_s, Facebook::CALLBACK_URL.to_s)
when 2, 3
initialize_without_default_settings(*args)
end
end

alias_method_chain :initialize, :default_settings
end

O código acima carrega as configurações Facebook.yml dentro do Facebook, desse modo você consegue acessar o AppID, o AppSecret e o CallbackURL a partir de qualquer lugar do seu aplicativo de uma maneira unificada. O método de extensão OAuth é tirado do guia do Koala para simplificar a instanciação do OAuth.new.

Parte do Controller 

No Controller da aplicação, adicione o seguinte:

#app/controller/application.rb

# protect_from_forgery

before_filter :parse_facebook_cookies
def parse_facebook_cookies
@facebook_cookies = Koala::Facebook::OAuth.new.get_user_info_from_cookie(cookies)
end

Note que protect_from_forgery foi comentado. As instruções a seguir permitem que o aplicativo carregue os detalhes do OAuth a partir dos cookies, para conseguir o token de acesso do Facebook.

Sua página de login

Adicione o conteúdo a seguir na sua página de login, neste caso, /app/views/layout/login.html.erb:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
xml:fb="http://www.facebook.com/2008/fbml">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>Udooz Sample</title>
<script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script>
</head>
<body>

<p style="color: green"><%= flash[:notice] %></p>
<div id="fb-root"></div>

<script type="text/javascript">
FB.init({
appId : '<%= Facebook::APP_ID %>',
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});

FB.login(function(response) {
if (response.session) {
location.href = '/home'
} else {
// user cancelled login
}
});
</script>
<h1>udooz</h1>
</body>
</html>

Neste exemplo, eu usei o JavaScript  SDK  do Facebook para a tela de login. Para usá-lo, eu inclui FBML scheme in <html> como xml:fb=”http://www.facebook.com/2008/fbml” seguido pelo arquivo de script SDK do Facebook referido.

Sua home page

Na sua home page, adicione o que vem a seguir:

Em app/controllers/HomeController.rb:

class HomeController < ApplicationController
def index
graph = Koala::Facebook::GraphAPI.new(@facebook_cookies["access_token"])
@likes = graph.get_connections("me", "likes")
end
end

No código acima, uma nova instância Graph foi criada. Ao usar isso, eu invoquei os likes dos usuários atualmente logados. 

Em app/views/home.html.erb:

<table border="0">
<% if @likes %>
<% for like in @likes %>
<tr>
<td><b><%=h like["name"]%> </b></td>
</tr>
<tr>
<td><%=h like["category"] %></td>
</tr>
<tr>
<td>&ndash;</td>
</tr>
<% end %>
<% end %>
</table>

Agora, rode seu aplicativo. Espero que seja fácil. 

?

Texto original disponível em http://udooz.net/blog/2011/02/facebook-app-using-rails-koala/