Para um de nossos clientes, estamos construindo um aplicativo de interface e uma camada de API. Toda a autenticação e outras coisas acontecerão na API e nossa interface usará OAuth para autenticar com a API.
Inicialmente, não queremos nenhum código de interface no aplicativo API, então eu estava procurando uma solução em que pudéssemos passar diretamente o nome de usuário e a senha de um formulário de login na interface para nosso Provedor OAuth de API.
Como estamos escrevendo os dois aplicativos, não precisamos que o usuário aceite o acesso ao aplicativo. Aqui está o código no controlador:
app / controllers / authorize_controller.rb
class AuthorizeController < ApplicationController
skip_before_filter :verify_authenticity_token
def sign_in
u = User.find_by_username(params[:username])
Songkick::OAuth2::Provider.handle_passwords do |client, username, password, scopes|
user = User.find_by_username!(username)
if user.authenticate?(password)
user.grant_access!(client)
else
nil
end
end
oauth = Songkick::OAuth2::Provider.parse(nil, env)
response.headers = oauth.response_headers
if body = oauth.response_body
render :text => body, :status => oauth.response_status
end
end
end
Aqui estão as rotas:
config / routes.rb
OauthProvider::Application.routes.draw do
post "/oauth/token" => "authorize#sign_in"
end
Estou usando o <a href=”songkick-oauth2-provider”> https://github.com/songkick/oauth2-provider </a>. Se você quiser saber como configurar seus modelos, leia seu README.
Eu criei uma pequena tarefa Rake para testar uma conexão tentando obter um token de acesso do provedor.
lib / tasks / oauth_test.rake
require 'oauth2'
namespace :oauth do
desc "Test our oauth connection"
task :test => :environment do
client = OAuth2::Client.new(
"h171cbibzlqfzkdojeqpwbjzt235xw5",
"4vs772iob20vtvtaxgy6ndnpauv2sj",
:site => "http://oauthprovider.dev")
token = client.password.get_token("michiel", "password")
puts token.inspect
end
end
Tudo funciona bem!
Se você tiver dúvidas sobre os detalhes. Ligue-me em <a href=” http://twitter.com/michiels”> @michiels </a> ou <a href=”mailto: michiel@firmhouse.com “> michiel@firmhouse.com </ a >!