Como utilizar o Twitter para autenticação no Rails 3 com o OAuth
by gregoriomelo on abril 10, 2011
Há uma enorme quantidade de pessoas que concorda que não precisamos mais ter que criar um cadastro de usuários completo. Quase todo mundo já tem uma conta no Twitter, no Facebook, em algum serviço da Google… Vejamos como utilizar o OAuth para que nossa aplicação utilize o Twitter.
O que é o OAuth?
OAuth (Open Authorization) is an open standard for authorization. It allows users to share their private resources (e.g. photos, videos, contact lists) stored on one site with another site without having to hand out their credentials, typically username and password.
Traduzindo: OAuth é um padrão aberto para autorização que permite que usuários compartilhem fotos, vídeos, contatos, etc., de um serviço para outro serviço sem que seja necessário fornecer as credenciais novamente, como nome de usuário e senha.
Quem usa
- Yahoo
- MySpace
- NetFlix
- TripIt
- Vimeo
- …inúmeros outros…
Rails 3 e OAuth
Comecemos, então, a criar uma aplicação que se integre com o OAuth:
rails new twitterfriend
Depois disso, edite o Gemfile e coloque a gem do OAuth:
gem 'omniauth'
E execute o Bundler para instalar a gem:
bundle install
Remova o index.html que vem com a aplicação e crie um controlador para gerenciar o acesso às páginas:
rm public/index.html
rails g controller pages index
Agora vamos configurar o roteamento para a raiz da aplicação. Edite o arquivo config/routes.rb e coloque a seguinte linha antes de ‘get “pages/index”‘:
root :to => 'pages#index'
Configurando o OAuth com o Twitter
Na pasta config/initializers, cria um arquivo chamado ‘omniauth.rb’ e coloque as seguintes linhas no seu conteúdo:
Rails.application.config.middleware.use OmniAuth::Builder do
provider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET'
end
CONSUMER_KEY e CONSUMER_SECRET são códigos que você deve obter no site http://dev.twitter.com/. Procure pela opção ‘Register an app’ e preencha o formulário.
No campo ‘Application Website’, coloque “http://127.0.0.1:3000” (sem aspas).
No campo ‘Application Type’, escolha “Browser“.
No campo ‘Callback URL’, preencha com “http://127.0.0.1:3000/auth/twitter/callback” (sem aspas).
Após a confirmação, você terá acesso aos códigos que precisa para configurar a aplicação Rails. Na página da aplicação no Twitter, procure pela seção ‘OAuth 1.0a Settings‘ e lá você encontrará as chaves.
Colocando a autenticação na aplicação
Por enquanto, nossa aplicação não tem nada de mais. Vamos colocar um link para a autenticação. Remova o conteúdo do arquivo ‘app/views/pages/index.html.erb’ e substitua por:
<%= link_to "Login no Twitter", "/auth/twitter"%>
Vejamos como fica no navegador. Execute o comando para rodar o servidor:
rails s
Ao clicar no link, você será redirecionado para uma página do Twitter questionando se deve ser permitido o acesso à aplicação. Confirme. Depois disso, :( uma mensagem de erro:
No route matches "/auth/twitter/callback"
Mas, na verdade, não fizemos muita coisa ainda. Este erro significa que não há rota para tratar o retorno do Twitter. Precisamos criar a rota e um controller para gerenciar a sessão HTTP. Além de gerenciar o sucesso da comunicação com o Twitter, precisamos ter um tratamento para o logout e outro para o caso em que a comunicação com o Twitter falhar. Criemos o tal controller:
rails g controller sessions create destroy failure
E agora, a rota. Edite o arquivo config/routes.rb novamente, apague as 3 entradas get do controller sessions e inclua estas:
match '/auth/twitter/callback' => 'sessions#create'
match '/auth/failure' => 'sessions#failure'
match '/logout' => 'sessions#destroy'
Lembra da configuração da opção ‘Callback URL’ na hora de cadastrar a aplicação do Twitter? A URL de callback é o endereço que deve ser acessado quando o Twitter devolver o controle para a sua aplicação. O erro que foi encontrado há pouco é justamente por isso. O Twitter retornou sucesso no login e a aplicação foi redirecionada para a URL configurada. Mas não tinha nada lá. Mas agora, tem. Vejamos novamente no navegador.
Pronto, melhorou! Para ficar melhor, vamos colocar o usuário na sessão. Edite o método create em ‘app/controllers/sessions_controller.rb’ e deixe-o assim:
def create
session[:auth] = request.env['omniauth.auth']
redirect_to root_path
end
Altere também o arquivo ‘config/initializers/session_store.rb’ e descomente a última linha. Depois disso, rode a task do rake para criar as sessões:
rake db:sessions:create
rake db:migrate
Fazendo isso, podemos colocar os dados do Twitter na sessão. Assim, vamos modificar a página index para que esta fique ciente que há um usuário logado.
Altere o conteúdo da página ‘app/views/pages/index.html.erb’ para este:
<% if session[:auth] %>
Bem-vindo, <%= session[:auth]['user_info']['name'] %>! <%= link_to 'Logout', logout_path %>
<% else %>
<%= link_to "Login no Twitter", "/auth/twitter"%>
<% end %>
Agora sabemos se o usuário está logado. Vamos agora colocar o logout. Edite o controller ‘app/controllers/sessions_controller.rb’ e, no método destroy, coloque o seguinte conteúdo:
session[:auth] = nil
redirect_to root_path
Assim, quando o usuário clicar em logout, ele será requisitado para logar no Twitter novamente.
Bem, não tá completo, nem temos o melhor código do mundo. Nem o teste tem aí. Porém, a intenção era mostrar como integrar o OAuth com o Rails 3. Então, o que tem aqui é o começo. E dá pra fazer muita coisa a partir daqui. Boa sorte!
Github
Coloquei o projeto no Github. Fique à vontade para cloná-lo:
git clone git@github.com:gregoriomelo/twitterfriend.git
Leave your comment