Skip to content

Commit

Permalink
[Closes #9] Added token dealer.
Browse files Browse the repository at this point in the history
 - Takes Rack::Request

 - Authenticates client

 - Builds, saves and returns token
  • Loading branch information
michaelengland committed May 31, 2013
1 parent d16df7d commit 59979d2
Show file tree
Hide file tree
Showing 16 changed files with 160 additions and 28 deletions.
3 changes: 2 additions & 1 deletion lib/oauth2_server/bearer_token.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
require 'oauth2_server/bearer_token/authenticator'
require 'oauth2_server/bearer_token/authentication_header_builder'
require 'oauth2_server/bearer_token/token_builder'
require 'oauth2_server/bearer_token/builder'
require 'oauth2_server/bearer_token/dealer'
6 changes: 6 additions & 0 deletions lib/oauth2_server/bearer_token/builder.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
require 'oauth2_server/bearer_token/builder/base'
require 'oauth2_server/bearer_token/builder/client_credentials'
require 'oauth2_server/bearer_token/builder/password'
require 'oauth2_server/bearer_token/builder/authorization_code'
require 'oauth2_server/bearer_token/builder/refresh_token'
require 'oauth2_server/bearer_token/builder/factory'
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

module Oauth2Server
module BearerToken
module TokenBuilder
module Builder
class AuthorizationCode < Base
def token
Entities::Token.new(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

module Oauth2Server
module BearerToken
module TokenBuilder
module Builder
class Base
def initialize(client, request, options = {})
@client = client
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module Oauth2Server
module BearerToken
module TokenBuilder
module Builder
class ClientCredentials < Base
def token
Entities::Token.new(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
module Oauth2Server
module BearerToken
module TokenBuilder
module Builder
class Factory
def initialize(client, request, options)
def initialize(client, request, options = {})
@client = client
@request = request
@options = options
end

def token_builder
def builder
case grant_type
when 'client_credentials'
ClientCredentials.new(client, request, options)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

module Oauth2Server
module BearerToken
module TokenBuilder
module Builder
class Password < Base
def token
Entities::Token.new(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

module Oauth2Server
module BearerToken
module TokenBuilder
module Builder
class RefreshToken < Base
def token
Entities::Token.new(
Expand Down
60 changes: 60 additions & 0 deletions lib/oauth2_server/bearer_token/dealer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
module Oauth2Server
module BearerToken
class Dealer
def initialize(request, options = {})
@request = request
@options = options
end

def token
@_token ||= begin
save_token
built_token
end
end

alias_method :deal!, :token

private
attr_reader :request, :options

def save_token
token_repositories.each do |repository|
repository.save_token(built_token)
end
end

def token_repositories
if options.has_key?(:token_repository)
Array(options[:token_repository])
elsif options.has_key?(:token_repositories)
options[:token_repositories]
elsif options.has_key?(:configuration)
options[:configuration].registered_token_repositories
else
Oauth2Server.configuration.registered_token_repositories
end
end

def built_token
@_built_token ||= token_builder.token
end

def token_builder
token_builder_factory.builder
end

def token_builder_factory
Builder::Factory.new(client, request, options)
end

def client
client_authenticator.client
end

def client_authenticator
ClientAuthenticator.new(request, options)
end
end
end
end
6 changes: 0 additions & 6 deletions lib/oauth2_server/bearer_token/token_builder.rb

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
require 'spec_helper'

describe Oauth2Server::BearerToken::TokenBuilder::AuthorizationCode do
describe Oauth2Server::BearerToken::Builder::AuthorizationCode do
subject(:authorization_code) { described_class.new(client, request, options) }
let(:client) { FactoryGirl.build(:client) }
let(:request) { Rack::Request.new(env) }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
require 'spec_helper'

describe Oauth2Server::BearerToken::TokenBuilder::ClientCredentials do
describe Oauth2Server::BearerToken::Builder::ClientCredentials do
subject(:client_credentials) { described_class.new(client, request, options) }
let(:client) { FactoryGirl.build(:client) }
let(:request) { stub('request') }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
require 'spec_helper'

describe Oauth2Server::BearerToken::TokenBuilder::Factory do
describe Oauth2Server::BearerToken::Builder::Factory do
subject(:factory) { described_class.new(client, request, options) }
let(:client) { FactoryGirl.build(:client) }
let(:request) { Rack::Request.new(env) }
Expand All @@ -9,14 +9,14 @@
context 'when no grant_type param' do
let(:env) { Rack::MockRequest.env_for('/') }

specify { expect { factory.token_builder }.to raise_error(
specify { expect { factory.builder }.to raise_error(
Oauth2Server::Errors::InvalidRequest, 'Missing grant_type') }
end

context 'when unsupported grant_type given' do
let(:env) { Rack::MockRequest.env_for('/?grant_type=nonsense') }

specify { expect { factory.token_builder }.to raise_error(
specify { expect { factory.builder }.to raise_error(
Oauth2Server::Errors::UnsupportedGrantType) }
end

Expand All @@ -26,18 +26,18 @@
password: 'Password',
authorization_code: 'AuthorizationCode',
refresh_token: 'RefreshToken'
}.each do |grant_type, token_builder_type|
}.each do |grant_type, builder_type|
context "when #{grant_type} grant_type given" do
let(:env) { Rack::MockRequest.env_for("/?grant_type=#{grant_type}") }
let(:token_builder) { stub(token_builder_type) }
let(:builder) { stub(builder_type) }

before do
"Oauth2Server::BearerToken::TokenBuilder::#{token_builder_type}".constantize.stub(:new).
with(client, request, options) { token_builder }
"Oauth2Server::BearerToken::Builder::#{builder_type}".constantize.stub(:new).
with(client, request, options) { builder }
end

it "creates and returns a #{token_builder_type} token builder" do
expect(factory.token_builder).to eql(token_builder)
it "creates and returns a #{builder_type} token builder" do
expect(factory.builder).to eql(builder)
end
end
end
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
require 'spec_helper'

describe Oauth2Server::BearerToken::TokenBuilder::Password do
describe Oauth2Server::BearerToken::Builder::Password do
subject(:password) { described_class.new(client, request, options) }
let(:client) { FactoryGirl.build(:client) }
let(:request) { Rack::Request.new(env) }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
require 'spec_helper'

describe Oauth2Server::BearerToken::TokenBuilder::RefreshToken do
describe Oauth2Server::BearerToken::Builder::RefreshToken do
subject(:refresh_token) { described_class.new(client, request, options) }
let(:client) { FactoryGirl.build(:client) }
let(:request) { Rack::Request.new(env) }
Expand Down
71 changes: 71 additions & 0 deletions spec/oauth2_server/bearer_token/dealer_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
require 'spec_helper'

describe Oauth2Server::BearerToken::Dealer do
subject(:dealer) { described_class.new(request, options) }
let(:request) { Rack::Request.new(env) }
let(:env) { Rack::MockRequest.env_for('/') }
let(:client_authenticator) { stub('ClientAuthenticator', client: client) }
let(:client) { FactoryGirl.build(:client) }
let(:builder_factory) { stub('BuilderFactory', builder: builder) }
let(:builder) { stub('Builder', token: token) }
let(:token) { FactoryGirl.build(:token) }
let(:token_repository) { stub('TokenRepository') }

before do
Oauth2Server::ClientAuthenticator.stub(:new).
with(request, options) { client_authenticator }
Oauth2Server::BearerToken::Builder::Factory.stub(:new).
with(client, request, options) { builder_factory }
token_repository.stub(:save_token).with(token)
end

shared_examples_for 'deals tokens' do
[:deal!, :token].each do |method|
describe "##{method}" do
it 'saves created token to repository' do
token_repository.should_receive(:save_token).with(token)
dealer.public_send(method)
end

it 'returns created token' do
expect(dealer.public_send(method)).to eql(token)
end
end
end
end

context 'when token_repository given' do
let(:options) { {token_repository: token_repository} }

it_behaves_like 'deals tokens'
end

context 'when an array of token repositories given' do
let(:options) { {token_repositories: [token_repository]} }

it_behaves_like 'deals tokens'
end

context 'when configuration given' do
let(:options) { {configuration: configuration} }
let(:configuration) { Oauth2Server::Configuration.new }

before do
configuration.register_token_repository(token_repository)
end

it_behaves_like 'deals tokens'
end

context 'when given no configuration' do
let(:options) { {} }
let(:configuration) { Oauth2Server::Configuration.new }

before do
configuration.register_token_repository(token_repository)
Oauth2Server.stub(:configuration) { configuration }
end

it_behaves_like 'deals tokens'
end
end

0 comments on commit 59979d2

Please sign in to comment.