aptible-auth 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 25bd04db8b8a3727e0f28197c3bfc46e4c11a9e8
4
- data.tar.gz: 1f0a678a374ebf27655ff4fc791dd4984dba8af5
3
+ metadata.gz: 101f4e5eba0e9ddacf579ed8758ebbbdfba30d84
4
+ data.tar.gz: b2daa6d3703e05bfcba62c36d7469890430a7463
5
5
  SHA512:
6
- metadata.gz: 86a0ec2af4dec80f3d87da1bf2ad9ac418f2e14ffa1754d691d50361d71ba2c05bd70e473ecc48e290074818f3f3f137cfd0741d96e0f6fa3c1cc97eb9c7f6b8
7
- data.tar.gz: c523b0a4b03ee140f74fb3e8b526a2c04b0dce0c871201893de743993a18bce480c36a9c0e1e061f99901ecef69c6498477226460f86ff1d26951f663587fcec
6
+ metadata.gz: 535418028b5197789fb200a8608133df28e5f2c6622d7a9d614c259409850139231209988a633a592fc6ef45e6808ecd8012ba1bea42223220b55e99df4280c8
7
+ data.tar.gz: c784ba5e1f430fd0ee88de2dc06a13214d7b0f4aab0c5ef57055fcd447dc4c56a69e02312f1293ff17612b179894c6b53ad8e734bd4a5c099d1a31fc9eae6c42
data/README.md CHANGED
@@ -4,21 +4,58 @@
4
4
  [![Build Status](https://travis-ci.org/aptible/aptible-auth-ruby.png?branch=master)](https://travis-ci.org/aptible/aptible-auth-ruby)
5
5
  [![Dependency Status](https://gemnasium.com/aptible/aptible-auth-ruby.png)](https://gemnasium.com/aptible/aptible-auth-ruby)
6
6
 
7
- Ruby client for [auth.aptible.com](https://auth.aptible.com/). Since Aptible's authorization service is built on OAuth 2.0, most developers should be able to implement a client using just the [oauth2](https://github.com/intridea/oauth2) gem.
8
-
9
- However, due to the complexity of OAuth 2.0 and the fact that it is a fragmented and evolving standard, we provide this gem as a standard Ruby client library. All of our internal services use it, and so it can be expected to work.
7
+ Ruby client for [auth.aptible.com](https://auth.aptible.com/). Aptible's authorization server is built on top of [OAuth 2.0](http://tools.ietf.org/html/rfc6749) and [HAL+JSON](http://tools.ietf.org/html/draft-kelly-json-hal-06), and so this client is just a thin layer on top of the [oauth2](https://github.com/intridea/oauth2) and [HyperResource](https://github.com/gamache/hyperresource) gems.
10
8
 
11
9
  ## Installation
12
10
 
13
- Add the following line to your application's Gemfile.
11
+ Add the following lines to your application's Gemfile.
14
12
 
15
13
  gem 'aptible-auth'
14
+ gem 'oauth2', github: 'fancyremarker/oauth2', branch: 'aptible'
15
+
16
+ The forked version of the OAuth2 gem is necessary until [intridea/oauth2#165](https://github.com/intridea/oauth2/pull/165) and [intridea/oauth2#166](https://github.com/intridea/oauth2/pull/166) are merged.
16
17
 
17
18
  And then run `bundle install`.
18
19
 
19
20
  ## Usage
20
21
 
21
- TODO: Add usage notes.
22
+ First, get a token:
23
+
24
+ ```ruby
25
+ token = Aptible::Auth::Token.new(email: 'user0@example.com', password: 'password')
26
+ ```
27
+
28
+ Then, initialize a client:
29
+ ```ruby
30
+ auth = Aptible::Auth::Client.new(token: token)
31
+ ```
32
+
33
+ From here, you can interact with the Authorization API however you wish:
34
+
35
+ ```ruby
36
+ auth.get
37
+ auth.clients.count
38
+ # => 4
39
+ auth.clients.first.name
40
+ # => "Client 0"
41
+ client = auth.clients.create(name: 'Dogeclient')
42
+ client.href
43
+ # => "http://localhost:4000/clients/60765b69-ffd8-4762-b9d2-96354ddb16f9"
44
+ ```
45
+
46
+ ## Configuration
47
+
48
+ | Parameter | Description | Default |
49
+ | --------- | ----------- | --------------- |
50
+ | `root_url` | Root URL of the authorization server | `https://auth.aptible.com` |
51
+
52
+ To point the client at a different authorization server (e.g., during development), add the following to your application's initializers:
53
+
54
+ ```ruby
55
+ Aptible::Auth.configure do |config|
56
+ config.root_url = 'http://some.other.url'
57
+ end
58
+ ```
22
59
 
23
60
  ## Contributing
24
61
 
@@ -19,10 +19,13 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(/^spec\//)
20
20
  spec.require_paths = ['lib']
21
21
 
22
+ spec.add_dependency 'gem_config'
22
23
  spec.add_dependency 'oauth2'
24
+ spec.add_dependency 'hyperresource'
23
25
 
24
26
  spec.add_development_dependency 'bundler', '~> 1.3'
25
27
  spec.add_development_dependency 'aptible-tasks', '>= 0.2.0'
26
28
  spec.add_development_dependency 'rake'
27
- spec.add_dependency 'rspec', '~> 2.0'
29
+ spec.add_development_dependency 'rspec', '~> 2.0'
30
+ spec.add_development_dependency 'pry'
28
31
  end
@@ -1,8 +1,19 @@
1
1
  require 'aptible/auth/version'
2
+ require 'aptible/auth/token'
2
3
  require 'aptible/auth/client'
3
4
 
5
+ require 'gem_config'
6
+
4
7
  module Aptible
5
8
  module Auth
6
- # Your code goes here...
9
+ include GemConfig::Base
10
+
11
+ with_configuration do
12
+ has :root_url, classes: [String], default: 'https://auth.aptible.com'
13
+ end
14
+
15
+ def self.public_key
16
+ Client.new.get.public_key
17
+ end
7
18
  end
8
19
  end
@@ -1,12 +1,27 @@
1
- require 'oauth2'
2
- require 'aptible/auth/strategy/pubkey'
1
+ require 'hyperresource'
3
2
 
4
3
  module Aptible
5
4
  module Auth
6
- class Client < OAuth2::Client
7
- # The Pubkey Strategy (Aptible-custom)
8
- def pubkey
9
- @pubkey ||= Aptible::Auth::Strategy::Pubkey.new(self)
5
+ class Client < HyperResource
6
+ attr_accessor :token, :config
7
+
8
+ def initialize(options = {})
9
+ unless options.is_a?(Hash)
10
+ fail ArgumentError, 'Call Aptible::Auth::Client.new with a Hash'
11
+ end
12
+ @token = options[:token]
13
+
14
+ options[:root] ||= config.root_url
15
+ options[:headers] ||= { 'Content-Type' => 'application/json' }
16
+ options[:headers].merge!(
17
+ 'Authorization' => "Bearer #{options[:token].access_token}"
18
+ ) if options[:token]
19
+
20
+ super(options)
21
+ end
22
+
23
+ def config
24
+ @config ||= Aptible::Auth.configuration
10
25
  end
11
26
  end
12
27
  end
@@ -0,0 +1,50 @@
1
+ require 'oauth2'
2
+
3
+ module Aptible
4
+ module Auth
5
+ class Token
6
+ attr_accessor :client, :access_token, :refresh_token, :expires_at
7
+
8
+ def initialize(options = {})
9
+ oauth_params = {
10
+ site: Aptible::Auth.configuration.root_url,
11
+ token_url: '/tokens'
12
+ }
13
+ @client = OAuth2::Client.new(nil, nil, oauth_params)
14
+
15
+ process_options(options)
16
+ end
17
+
18
+ def authenticate_user(email, password, options = {})
19
+ options[:scope] ||= 'manage'
20
+ response = client.password.get_token(email, password, options)
21
+ parse_oauth_response(response)
22
+ end
23
+
24
+ def authenticate_client(id, secret, user, options = {})
25
+ options[:scope] ||= 'manage'
26
+ response = client.assertion.get_token(id, secret, user, options)
27
+ parse_oauth_response(response)
28
+ end
29
+
30
+ private
31
+
32
+ def process_options(options)
33
+ if (email = options.delete(:email)) &&
34
+ (password = options.delete(:password))
35
+ authenticate_user(email, password, options)
36
+ elsif (client_id = options.delete(:client_id)) &&
37
+ (client_secret = options.delete(:client_secret)) &&
38
+ (user = options.delete(:user))
39
+ authenticate_client(client_id, client_secret, user, options)
40
+ end
41
+ end
42
+
43
+ def parse_oauth_response(response)
44
+ @access_token = response.token
45
+ @refresh_token = response.refresh_token
46
+ @expires_at = Time.at(response.expires_at)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,5 +1,5 @@
1
1
  module Aptible
2
2
  module Auth
3
- VERSION = '0.0.1'
3
+ VERSION = '0.1.0'
4
4
  end
5
5
  end
@@ -1,5 +1,9 @@
1
1
  require 'spec_helper'
2
- require 'aptible/auth/client'
3
2
 
4
3
  describe Aptible::Auth::Client do
4
+ describe '#initialize' do
5
+ it 'should be a HyperResource instance' do
6
+ expect(subject).to be_a HyperResource
7
+ end
8
+ end
5
9
  end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe Aptible::Auth::Token do
4
+ let(:client) { double OAuth2::Client }
5
+ let(:response) { double OAuth2::AccessToken }
6
+
7
+ before { response.stub(:token) }
8
+ before { response.stub(:refresh_token) }
9
+ before { response.stub(:expires_at) { Time.now.to_i } }
10
+
11
+ describe '#initialize' do
12
+ it 'should call #authenticate_user if passed :email and :password' do
13
+ Aptible::Auth::Token.any_instance.should_receive(
14
+ :authenticate_user
15
+ ).with 'user@example.com', 'foobar', {}
16
+ described_class.new(email: 'user@example.com', password: 'foobar')
17
+ end
18
+
19
+ it 'should #authenticate_client if passed a client ID and secret' do
20
+ Aptible::Auth::Token.any_instance.should_receive(
21
+ :authenticate_client
22
+ ).with 'id', 'secret', 'user@example.com', {}
23
+ described_class.new(
24
+ client_id: 'id',
25
+ client_secret: 'secret',
26
+ user: 'user@example.com'
27
+ )
28
+ end
29
+
30
+ it 'should not raise error if given no arguments' do
31
+ expect { described_class.new }.not_to raise_error
32
+ end
33
+ end
34
+
35
+ describe '#authenticate_user' do
36
+ let(:args) { %w(user@example.com foobar) }
37
+
38
+ before { subject.stub(:client) { client } }
39
+ before { client.stub_chain(:password, :get_token) { response } }
40
+
41
+ it 'should use the password strategy' do
42
+ params = { scope: 'manage' }
43
+ expect(client.password).to receive(:get_token).with(*(args + [params]))
44
+ subject.authenticate_user(*args)
45
+ end
46
+
47
+ it 'should allow the token scope to be specified' do
48
+ args << { scope: 'read' }
49
+ expect(client.password).to receive(:get_token).with(*args)
50
+ subject.authenticate_user(*args)
51
+ end
52
+
53
+ it 'should set the access_token' do
54
+ client.stub_chain(:password, :get_token, :token) { 'access_token' }
55
+ subject.authenticate_user(*args)
56
+ expect(subject.access_token).to eq 'access_token'
57
+ end
58
+ end
59
+
60
+ describe '#authenticate_client' do
61
+ let(:args) { %w(id secret user@example.com) }
62
+
63
+ before { subject.stub(:client) { client } }
64
+ before { client.stub_chain(:assertion, :get_token) { response } }
65
+
66
+ it 'should use the assertion strategy' do
67
+ params = { scope: 'manage' }
68
+ expect(client.assertion).to receive(:get_token).with(*(args + [params]))
69
+ subject.authenticate_client(*args)
70
+ end
71
+
72
+ it 'should allow the token scope to be specified' do
73
+ args << { scope: 'read' }
74
+ expect(client.assertion).to receive(:get_token).with(*args)
75
+ subject.authenticate_client(*args)
76
+ end
77
+
78
+ it 'should set the access_token' do
79
+ client.stub_chain(:assertion, :get_token, :token) { 'access_token' }
80
+ subject.authenticate_client(*args)
81
+ expect(subject.access_token).to eq 'access_token'
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Aptible::Auth do
4
+ it 'should have a configurable root_url' do
5
+ config = described_class.configuration
6
+ expect(config).to be_a GemConfig::Configuration
7
+ expect(config.root_url).to eq 'https://auth.aptible.com'
8
+ end
9
+
10
+ it 'should expose the server public key' do
11
+ get = double 'get'
12
+ Aptible::Auth::Client.any_instance.stub(:get) { get }
13
+ expect(get).to receive :public_key
14
+ described_class.public_key
15
+ end
16
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aptible-auth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Frank Macreery
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-07 00:00:00.000000000 Z
11
+ date: 2014-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gem_config
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: oauth2
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +38,20 @@ dependencies:
24
38
  - - '>='
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: hyperresource
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: bundler
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -73,13 +101,27 @@ dependencies:
73
101
  - - ~>
74
102
  - !ruby/object:Gem::Version
75
103
  version: '2.0'
76
- type: :runtime
104
+ type: :development
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
108
  - - ~>
81
109
  - !ruby/object:Gem::Version
82
110
  version: '2.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
83
125
  description: Ruby client for auth.aptible.com
84
126
  email:
85
127
  - frank@macreery.com
@@ -97,10 +139,11 @@ files:
97
139
  - aptible-auth.gemspec
98
140
  - lib/aptible/auth.rb
99
141
  - lib/aptible/auth/client.rb
100
- - lib/aptible/auth/strategy/pubkey.rb
142
+ - lib/aptible/auth/token.rb
101
143
  - lib/aptible/auth/version.rb
102
144
  - spec/aptible/auth/client_spec.rb
103
- - spec/aptible/auth/strategy/pubkey_spec.rb
145
+ - spec/aptible/auth/token_spec.rb
146
+ - spec/aptible/auth_spec.rb
104
147
  - spec/spec_helper.rb
105
148
  homepage: https://github.com/aptible/aptible-auth
106
149
  licenses:
@@ -122,11 +165,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
165
  version: '0'
123
166
  requirements: []
124
167
  rubyforge_project:
125
- rubygems_version: 2.0.14
168
+ rubygems_version: 2.2.1
126
169
  signing_key:
127
170
  specification_version: 4
128
171
  summary: Ruby client for auth.aptible.com
129
172
  test_files:
130
173
  - spec/aptible/auth/client_spec.rb
131
- - spec/aptible/auth/strategy/pubkey_spec.rb
174
+ - spec/aptible/auth/token_spec.rb
175
+ - spec/aptible/auth_spec.rb
132
176
  - spec/spec_helper.rb
@@ -1,25 +0,0 @@
1
- require 'oauth2'
2
-
3
- module Aptible
4
- module Auth
5
- module Strategy
6
- # The Pubkey Strategy (Aptible-custom)
7
- class Pubkey < OAuth2::Strategy::Base
8
- # TODO: Implement
9
- #
10
- # @raise [NotImplementedError]
11
- def get_token(fingerprint, params = {}, opts = {})
12
- # rubocop:disable UselessAssignment
13
- params = {
14
- 'grant_type' => 'pubkey',
15
- 'fingerprint' => fingerprint,
16
- 'password' => password
17
- }.merge(client_params).merge(params)
18
- # rubocop:enable UselessAssignment
19
-
20
- fail NotImplementedError, 'Strategy not yet implemented'
21
- end
22
- end
23
- end
24
- end
25
- end
@@ -1,5 +0,0 @@
1
- require 'spec_helper'
2
- require 'aptible/auth/strategy/pubkey'
3
-
4
- describe Aptible::Auth::Strategy::Pubkey do
5
- end