Como simplesmente implementar seu próprio provedor OAuth2 com acesso direto de usuário / senha

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 >!