jmoses_api-auth 1.0.4
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.
- data/.document +5 -0
- data/.gitignore +44 -0
- data/.rspec +3 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +46 -0
- data/LICENSE.txt +20 -0
- data/README.md +185 -0
- data/Rakefile +22 -0
- data/VERSION +1 -0
- data/api_auth.gemspec +26 -0
- data/lib/api-auth.rb +2 -0
- data/lib/api_auth/base.rb +97 -0
- data/lib/api_auth/errors.rb +9 -0
- data/lib/api_auth/headers.rb +82 -0
- data/lib/api_auth/helpers.rb +18 -0
- data/lib/api_auth/railtie.rb +129 -0
- data/lib/api_auth/request_drivers/action_controller.rb +85 -0
- data/lib/api_auth/request_drivers/action_dispatch.rb +15 -0
- data/lib/api_auth/request_drivers/curb.rb +70 -0
- data/lib/api_auth/request_drivers/net_http.rb +78 -0
- data/lib/api_auth/request_drivers/rack.rb +85 -0
- data/lib/api_auth/request_drivers/rest_client.rb +93 -0
- data/lib/api_auth.rb +16 -0
- data/spec/api_auth_spec.rb +407 -0
- data/spec/application_helper.rb +2 -0
- data/spec/headers_spec.rb +223 -0
- data/spec/helpers_spec.rb +14 -0
- data/spec/railtie_spec.rb +114 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/test_helper.rb +2 -0
- metadata +212 -0
@@ -0,0 +1,114 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Rails integration" do
|
4
|
+
|
5
|
+
API_KEY_STORE = { "1044" => "l16imAXie1sRMcJODpOG7UwC1VyoqvO13jejkfpKWX4Z09W8DC9IrU23DvCwMry7pgSFW6c5S1GIfV0OY6F/vUA==" }
|
6
|
+
|
7
|
+
describe "Rails controller integration" do
|
8
|
+
|
9
|
+
class ApplicationController < ActionController::Base
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def require_api_auth
|
14
|
+
if (access_id = get_api_access_id_from_request)
|
15
|
+
return true if api_authenticated?(API_KEY_STORE[access_id])
|
16
|
+
end
|
17
|
+
|
18
|
+
respond_to do |format|
|
19
|
+
format.xml { render :xml => "You are unauthorized to perform this action.", :status => 401 }
|
20
|
+
format.json { render :json => "You are unauthorized to perform this action.", :status => 401 }
|
21
|
+
format.html { render :text => "You are unauthorized to perform this action", :status => 401 }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
class TestController < ApplicationController
|
28
|
+
before_filter :require_api_auth, :only => [:index]
|
29
|
+
|
30
|
+
def index
|
31
|
+
render :text => "OK"
|
32
|
+
end
|
33
|
+
|
34
|
+
def public
|
35
|
+
render :text => "OK"
|
36
|
+
end
|
37
|
+
|
38
|
+
def rescue_action(e); raise(e); end
|
39
|
+
end
|
40
|
+
ActionController::Routing::Routes.draw {|map| map.resources :test }
|
41
|
+
|
42
|
+
it "should permit a request with properly signed headers" do
|
43
|
+
request = ActionController::TestRequest.new
|
44
|
+
request.env['DATE'] = Time.now.utc.httpdate
|
45
|
+
request.action = 'index'
|
46
|
+
request.path = "/index"
|
47
|
+
ApiAuth.sign!(request, "1044", API_KEY_STORE["1044"])
|
48
|
+
TestController.new.process(request, ActionController::TestResponse.new).code.should == "200"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should forbid a request with properly signed headers but timestamp > 15 minutes" do
|
52
|
+
request = ActionController::TestRequest.new
|
53
|
+
request.env['DATE'] = "Mon, 23 Jan 1984 03:29:56 GMT"
|
54
|
+
request.action = 'index'
|
55
|
+
request.path = "/index"
|
56
|
+
ApiAuth.sign!(request, "1044", API_KEY_STORE["1044"])
|
57
|
+
TestController.new.process(request, ActionController::TestResponse.new).code.should == "401"
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should insert a DATE header in the request when one hasn't been specified" do
|
61
|
+
request = ActionController::TestRequest.new
|
62
|
+
request.action = 'index'
|
63
|
+
request.path = "/index"
|
64
|
+
ApiAuth.sign!(request, "1044", API_KEY_STORE["1044"])
|
65
|
+
request.headers['DATE'].should_not be_nil
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should forbid an unsigned request to a protected controller action" do
|
69
|
+
request = ActionController::TestRequest.new
|
70
|
+
request.action = 'index'
|
71
|
+
TestController.new.process(request, ActionController::TestResponse.new).code.should == "401"
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should forbid a request with a bogus signature" do
|
75
|
+
request = ActionController::TestRequest.new
|
76
|
+
request.action = 'index'
|
77
|
+
request.env['Authorization'] = "APIAuth bogus:bogus"
|
78
|
+
TestController.new.process(request, ActionController::TestResponse.new).code.should == "401"
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should allow non-protected controller actions to function as before" do
|
82
|
+
request = ActionController::TestRequest.new
|
83
|
+
request.action = 'public'
|
84
|
+
request.path('/public')
|
85
|
+
TestController.new.process(request, ActionController::TestResponse.new).code.should == "200"
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "Rails ActiveResource integration" do
|
91
|
+
|
92
|
+
class TestResource < ActiveResource::Base
|
93
|
+
with_api_auth "1044", API_KEY_STORE["1044"]
|
94
|
+
self.site = "http://localhost/"
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should send signed requests automagically" do
|
98
|
+
timestamp = Time.parse("Mon, 23 Jan 1984 03:29:56 GMT")
|
99
|
+
Time.should_receive(:now).at_least(1).times.and_return(timestamp)
|
100
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
101
|
+
mock.get "/test_resources/1.xml",
|
102
|
+
{
|
103
|
+
'Authorization' => 'APIAuth 1044:IbTx7VzSOGU55HNbV4y2jZDnVis=',
|
104
|
+
'Accept' => 'application/xml',
|
105
|
+
'DATE' => "Mon, 23 Jan 1984 03:29:56 GMT"
|
106
|
+
},
|
107
|
+
{ :id => "1" }.to_xml(:root => 'test_resource')
|
108
|
+
end
|
109
|
+
TestResource.find(1)
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
require 'rspec'
|
4
|
+
require 'api_auth'
|
5
|
+
require 'amatch'
|
6
|
+
require 'rest_client'
|
7
|
+
require 'curb'
|
8
|
+
|
9
|
+
require 'active_support'
|
10
|
+
require 'active_support/test_case'
|
11
|
+
require 'action_controller'
|
12
|
+
require 'action_controller/test_process'
|
13
|
+
require 'active_resource'
|
14
|
+
require 'active_resource/http_mock'
|
15
|
+
|
16
|
+
# Requires supporting files with custom matchers and macros, etc,
|
17
|
+
# in ./support/ and its subdirectories.
|
18
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
19
|
+
|
20
|
+
RSpec.configure do |config|
|
21
|
+
|
22
|
+
end
|
data/spec/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,212 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jmoses_api-auth
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.4
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jon Moses
|
9
|
+
- Mauricio Gomes
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-07-31 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rake
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: amatch
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
type: :development
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 2.4.0
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ~>
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 2.4.0
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: actionpack
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ~>
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 2.3.2
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ~>
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 2.3.2
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: activesupport
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ~>
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: 2.3.2
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ~>
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 2.3.2
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: activeresource
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ~>
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 2.3.2
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 2.3.2
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rest-client
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ~>
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 1.6.0
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ~>
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 1.6.0
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: curb
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - ~>
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: 0.8.1
|
135
|
+
type: :development
|
136
|
+
prerelease: false
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
139
|
+
requirements:
|
140
|
+
- - ~>
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: 0.8.1
|
143
|
+
description: Full HMAC auth implementation for use in your gems and Rails apps.
|
144
|
+
email:
|
145
|
+
- jon@burningbush.us
|
146
|
+
- mauricio@edge14.com
|
147
|
+
executables: []
|
148
|
+
extensions: []
|
149
|
+
extra_rdoc_files: []
|
150
|
+
files:
|
151
|
+
- .document
|
152
|
+
- .gitignore
|
153
|
+
- .rspec
|
154
|
+
- Gemfile
|
155
|
+
- Gemfile.lock
|
156
|
+
- LICENSE.txt
|
157
|
+
- README.md
|
158
|
+
- Rakefile
|
159
|
+
- VERSION
|
160
|
+
- api_auth.gemspec
|
161
|
+
- lib/api-auth.rb
|
162
|
+
- lib/api_auth.rb
|
163
|
+
- lib/api_auth/base.rb
|
164
|
+
- lib/api_auth/errors.rb
|
165
|
+
- lib/api_auth/headers.rb
|
166
|
+
- lib/api_auth/helpers.rb
|
167
|
+
- lib/api_auth/railtie.rb
|
168
|
+
- lib/api_auth/request_drivers/action_controller.rb
|
169
|
+
- lib/api_auth/request_drivers/action_dispatch.rb
|
170
|
+
- lib/api_auth/request_drivers/curb.rb
|
171
|
+
- lib/api_auth/request_drivers/net_http.rb
|
172
|
+
- lib/api_auth/request_drivers/rack.rb
|
173
|
+
- lib/api_auth/request_drivers/rest_client.rb
|
174
|
+
- spec/api_auth_spec.rb
|
175
|
+
- spec/application_helper.rb
|
176
|
+
- spec/headers_spec.rb
|
177
|
+
- spec/helpers_spec.rb
|
178
|
+
- spec/railtie_spec.rb
|
179
|
+
- spec/spec_helper.rb
|
180
|
+
- spec/test_helper.rb
|
181
|
+
homepage: https://github.com/jmoses/api_auth
|
182
|
+
licenses: []
|
183
|
+
post_install_message:
|
184
|
+
rdoc_options: []
|
185
|
+
require_paths:
|
186
|
+
- lib
|
187
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
188
|
+
none: false
|
189
|
+
requirements:
|
190
|
+
- - ! '>='
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
version: '0'
|
193
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
194
|
+
none: false
|
195
|
+
requirements:
|
196
|
+
- - ! '>='
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
version: '0'
|
199
|
+
requirements: []
|
200
|
+
rubyforge_project:
|
201
|
+
rubygems_version: 1.8.24
|
202
|
+
signing_key:
|
203
|
+
specification_version: 3
|
204
|
+
summary: Simple HMAC authentication for your APIs (fork by jmoses)
|
205
|
+
test_files:
|
206
|
+
- spec/api_auth_spec.rb
|
207
|
+
- spec/application_helper.rb
|
208
|
+
- spec/headers_spec.rb
|
209
|
+
- spec/helpers_spec.rb
|
210
|
+
- spec/railtie_spec.rb
|
211
|
+
- spec/spec_helper.rb
|
212
|
+
- spec/test_helper.rb
|