rack-oauth2 0.4.6 → 0.5.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.
- data/README.rdoc +4 -4
- data/VERSION +1 -1
- data/lib/rack/oauth2/server/abstract/error.rb +2 -1
- data/lib/rack/oauth2/server/resource/bearer.rb +7 -7
- data/lib/rack/oauth2/server/resource/bearer/error.rb +6 -7
- data/rack-oauth2.gemspec +1 -1
- data/spec/fake_response/token.json +1 -0
- data/spec/rack/oauth2/client_spec.rb +7 -0
- data/spec/rack/oauth2/server/resource/bearer/error_spec.rb +14 -2
- data/spec/rack/oauth2/server/resource/bearer_spec.rb +27 -3
- metadata +6 -6
data/README.rdoc
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
= rack-oauth2
|
2
2
|
|
3
|
-
Rack Middleware for OAuth2 server.
|
3
|
+
Rack Middleware for OAuth2 server.
|
4
|
+
OAuth2 client library is also included.
|
4
5
|
|
5
6
|
This gem is based on OAuth 2.0 draft v.13
|
6
7
|
http://tools.ietf.org/html/draft-ietf-oauth-v2-13
|
@@ -11,10 +12,9 @@ http://tools.ietf.org/html/draft-ietf-oauth-v2-13
|
|
11
12
|
|
12
13
|
== Resources
|
13
14
|
|
14
|
-
* View RDoc on RDoc.info (http://rdoc.info/github/nov/rack-oauth2)
|
15
15
|
* View Source on GitHub (http://github.com/nov/rack-oauth2)
|
16
16
|
* Report Issues on GitHub (http://github.com/nov/rack-oauth2/issues)
|
17
|
-
*
|
17
|
+
* Subscribe Update Info (http://www.facebook.com/pages/RackOAuth2/141477809244105)
|
18
18
|
|
19
19
|
== Sample Server Application (Rails3)
|
20
20
|
|
@@ -29,7 +29,7 @@ http://github.com/nov/rack-oauth2-sample
|
|
29
29
|
Authorization Request (request_type: 'code' and 'token')
|
30
30
|
https://gist.github.com/862393
|
31
31
|
|
32
|
-
Token Request (grant_type: 'client_credentials', 'password' and '
|
32
|
+
Token Request (grant_type: 'client_credentials', 'password', 'authorization_code' and 'refresh_token')
|
33
33
|
https://gist.github.com/883541
|
34
34
|
|
35
35
|
Resource Request (request both for resource owner resource and for client resource)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
@@ -3,13 +3,14 @@ module Rack
|
|
3
3
|
module Server
|
4
4
|
module Abstract
|
5
5
|
class Error < StandardError
|
6
|
-
attr_accessor :status, :error, :description, :uri
|
6
|
+
attr_accessor :status, :error, :description, :uri, :realm
|
7
7
|
|
8
8
|
def initialize(status, error, description = nil, options = {})
|
9
9
|
@status = status
|
10
10
|
@error = error
|
11
11
|
@description = description
|
12
12
|
@uri = options[:uri]
|
13
|
+
@realm = options[:realm]
|
13
14
|
end
|
14
15
|
|
15
16
|
def protocol_params
|
@@ -3,10 +3,13 @@ module Rack
|
|
3
3
|
module Server
|
4
4
|
module Resource
|
5
5
|
class Bearer < Abstract::Handler
|
6
|
-
ACCESS_TOKEN = 'rack.oauth2.
|
6
|
+
ACCESS_TOKEN = 'rack.oauth2.bearer_token'
|
7
|
+
DEFAULT_REALM = 'Bearer Token Required'
|
8
|
+
attr_accessor :realm
|
7
9
|
|
8
|
-
def initialize(app,
|
10
|
+
def initialize(app, realm = nil,&authenticator)
|
9
11
|
@app = app
|
12
|
+
@realm = realm
|
10
13
|
super(&authenticator)
|
11
14
|
end
|
12
15
|
|
@@ -18,6 +21,7 @@ module Rack
|
|
18
21
|
end
|
19
22
|
@app.call(env)
|
20
23
|
rescue Rack::OAuth2::Server::Abstract::Error => e
|
24
|
+
e.realm ||= realm
|
21
25
|
e.finish
|
22
26
|
end
|
23
27
|
|
@@ -58,11 +62,7 @@ module Rack
|
|
58
62
|
end
|
59
63
|
|
60
64
|
def access_token_in_payload
|
61
|
-
|
62
|
-
params['oauth_token']
|
63
|
-
else
|
64
|
-
nil # This is OAuth1 request
|
65
|
-
end
|
65
|
+
params['bearer_token']
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
@@ -9,13 +9,12 @@ module Rack
|
|
9
9
|
class Unauthorized < Abstract::Unauthorized
|
10
10
|
def finish
|
11
11
|
super do |response|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
header
|
16
|
-
header
|
17
|
-
|
18
|
-
'Bearer'
|
12
|
+
self.realm ||= DEFAULT_REALM
|
13
|
+
header = response.header['WWW-Authenticate'] = "Bearer realm=\"#{realm}\""
|
14
|
+
if ErrorMethods::DEFAULT_DESCRIPTION.keys.include?(error)
|
15
|
+
header << " error=\"#{error}\""
|
16
|
+
header << " error_description=\"#{description}\"" if description.present?
|
17
|
+
header << " error_uri=\"#{uri}\"" if uri.present?
|
19
18
|
end
|
20
19
|
end
|
21
20
|
end
|
data/rack-oauth2.gemspec
CHANGED
@@ -3,7 +3,7 @@ Gem::Specification.new do |s|
|
|
3
3
|
s.version = File.read("VERSION")
|
4
4
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6") if s.respond_to? :required_rubygems_version=
|
5
5
|
s.authors = ["nov matake"]
|
6
|
-
s.description = %q{Rack Middleware for OAuth2 server.
|
6
|
+
s.description = %q{Rack Middleware for OAuth2 server. OAuth2 client library is also included.}
|
7
7
|
s.summary = %q{Rack Middleware for OAuth2 server}
|
8
8
|
s.email = "nov@matake.jp"
|
9
9
|
s.extra_rdoc_files = ["LICENSE", "README.rdoc"]
|
@@ -67,6 +67,12 @@ describe Rack::OAuth2::Client do
|
|
67
67
|
it { should be_instance_of Rack::OAuth2::Client::Grant::Password }
|
68
68
|
end
|
69
69
|
|
70
|
+
describe '#refresh_token=' do
|
71
|
+
before { client.refresh_token = 'refresh_token' }
|
72
|
+
subject { client.instance_variable_get('@grant') }
|
73
|
+
it { should be_instance_of Rack::OAuth2::Client::Grant::RefreshToken }
|
74
|
+
end
|
75
|
+
|
70
76
|
describe '#access_token!' do
|
71
77
|
before do
|
72
78
|
client.authorization_code = 'code'
|
@@ -79,6 +85,7 @@ describe Rack::OAuth2::Client do
|
|
79
85
|
it do
|
80
86
|
client.access_token!.should == {
|
81
87
|
'access_token' => 'access_token',
|
88
|
+
'token_type' => 'bearer',
|
82
89
|
'expires_in' => 3600
|
83
90
|
}
|
84
91
|
end
|
@@ -16,6 +16,7 @@ end
|
|
16
16
|
|
17
17
|
describe Rack::OAuth2::Server::Resource::Bearer::Unauthorized do
|
18
18
|
let(:error) { Rack::OAuth2::Server::Resource::Bearer::Unauthorized.new(:invalid_token) }
|
19
|
+
let(:realm) { Rack::OAuth2::Server::Resource::Bearer::DEFAULT_REALM }
|
19
20
|
|
20
21
|
it { should be_a Rack::OAuth2::Server::Abstract::Unauthorized }
|
21
22
|
describe '#finish' do
|
@@ -23,7 +24,7 @@ describe Rack::OAuth2::Server::Resource::Bearer::Unauthorized do
|
|
23
24
|
status, header, response = error.finish
|
24
25
|
status.should == 401
|
25
26
|
header['Content-Type'].should == 'application/json'
|
26
|
-
header['WWW-Authenticate'].should ==
|
27
|
+
header['WWW-Authenticate'].should == "Bearer realm=\"#{realm}\" error=\"invalid_token\""
|
27
28
|
response.body.should == ['{"error":"invalid_token"}']
|
28
29
|
end
|
29
30
|
end
|
@@ -33,7 +34,18 @@ describe Rack::OAuth2::Server::Resource::Bearer::Unauthorized do
|
|
33
34
|
|
34
35
|
it 'should have error_code in body but not in WWW-Authenticate header' do
|
35
36
|
status, header, response = error.finish
|
36
|
-
header['WWW-Authenticate'].should ==
|
37
|
+
header['WWW-Authenticate'].should == "Bearer realm=\"#{realm}\""
|
38
|
+
response.body.first.should include '"error":"something"'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when realm is specified' do
|
43
|
+
let(:realm) { 'server.example.com' }
|
44
|
+
let(:error) { Rack::OAuth2::Server::Resource::Bearer::Unauthorized.new(:something, nil, :realm => realm) }
|
45
|
+
|
46
|
+
it 'should use given realm' do
|
47
|
+
status, header, response = error.finish
|
48
|
+
header['WWW-Authenticate'].should == "Bearer realm=\"#{realm}\""
|
37
49
|
response.body.first.should include '"error":"something"'
|
38
50
|
end
|
39
51
|
end
|
@@ -59,7 +59,7 @@ describe Rack::OAuth2::Server::Resource::Bearer do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
context 'when token is in params' do
|
62
|
-
let(:env) { Rack::MockRequest.env_for('/protected_resource', :params => {:
|
62
|
+
let(:env) { Rack::MockRequest.env_for('/protected_resource', :params => {:bearer_token => 'valid_token'}) }
|
63
63
|
it_behaves_like :authenticated_request
|
64
64
|
end
|
65
65
|
end
|
@@ -71,7 +71,7 @@ describe Rack::OAuth2::Server::Resource::Bearer do
|
|
71
71
|
end
|
72
72
|
|
73
73
|
context 'when token is in params' do
|
74
|
-
let(:env) { Rack::MockRequest.env_for('/protected_resource', :params => {:
|
74
|
+
let(:env) { Rack::MockRequest.env_for('/protected_resource', :params => {:bearer_token => 'invalid_token'}) }
|
75
75
|
it_behaves_like :unauthorized_request
|
76
76
|
end
|
77
77
|
end
|
@@ -82,7 +82,7 @@ describe Rack::OAuth2::Server::Resource::Bearer do
|
|
82
82
|
Rack::MockRequest.env_for(
|
83
83
|
'/protected_resource',
|
84
84
|
'HTTP_AUTHORIZATION' => 'Bearer valid_token',
|
85
|
-
:params => {:
|
85
|
+
:params => {:bearer_token => 'valid_token'}
|
86
86
|
)
|
87
87
|
end
|
88
88
|
it_behaves_like :bad_request
|
@@ -114,4 +114,28 @@ describe Rack::OAuth2::Server::Resource::Bearer do
|
|
114
114
|
it_behaves_like :non_oauth2_request
|
115
115
|
end
|
116
116
|
end
|
117
|
+
|
118
|
+
describe 'realm' do
|
119
|
+
let(:env) { Rack::MockRequest.env_for('/protected_resource', 'HTTP_AUTHORIZATION' => 'Bearer invalid_token') }
|
120
|
+
|
121
|
+
context 'when specified' do
|
122
|
+
let(:realm) { 'server.example.com' }
|
123
|
+
let(:app) do
|
124
|
+
Rack::OAuth2::Server::Resource::Bearer.new(simple_app, realm) do |request|
|
125
|
+
request.unauthorized!
|
126
|
+
end
|
127
|
+
end
|
128
|
+
it 'should use specified realm' do
|
129
|
+
status, header, response = request
|
130
|
+
header['WWW-Authenticate'].should include "Bearer realm=\"#{realm}\""
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'otherwize' do
|
135
|
+
it 'should use default realm' do
|
136
|
+
status, header, response = request
|
137
|
+
header['WWW-Authenticate'].should include "Bearer realm=\"#{Rack::OAuth2::Server::Resource::Bearer::DEFAULT_REALM}\""
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
117
141
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-oauth2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 5
|
9
|
+
- 0
|
10
|
+
version: 0.5.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- nov matake
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-01 00:00:00 +09:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -167,7 +167,7 @@ dependencies:
|
|
167
167
|
version: "1.3"
|
168
168
|
type: :development
|
169
169
|
version_requirements: *id010
|
170
|
-
description: Rack Middleware for OAuth2 server.
|
170
|
+
description: Rack Middleware for OAuth2 server. OAuth2 client library is also included.
|
171
171
|
email: nov@matake.jp
|
172
172
|
executables: []
|
173
173
|
|