rack-oauth2 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/rack/oauth2/client/grant/authorization_code.rb +11 -0
- data/lib/rack/oauth2/client/grant/client_credentials.rb +10 -0
- data/lib/rack/oauth2/client/grant/password.rb +11 -0
- data/lib/rack/oauth2/client/grant.rb +28 -0
- data/lib/rack/oauth2/client.rb +85 -0
- data/lib/rack/oauth2/server.rb +0 -1
- data/lib/rack/oauth2/util.rb +47 -0
- data/lib/rack/oauth2.rb +4 -1
- metadata +11 -6
- data/lib/rack/oauth2/server/util.rb +0 -49
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Rack
|
2
|
+
module OAuth2
|
3
|
+
class Client
|
4
|
+
class Grant
|
5
|
+
include AttrRequired, AttrOptional
|
6
|
+
|
7
|
+
def initialize(attributes = {})
|
8
|
+
required_attributes.each do |key|
|
9
|
+
self.send "#{key}=", attributes[key]
|
10
|
+
end
|
11
|
+
attr_missing!
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_hash
|
15
|
+
required_attributes.inject({
|
16
|
+
:grant_type => self.class.name.split('::').last.underscore.to_sym
|
17
|
+
}) do |hash, key|
|
18
|
+
hash.merge! key => self.send(key)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require 'rack/oauth2/client/grant/authorization_code'
|
27
|
+
require 'rack/oauth2/client/grant/password'
|
28
|
+
require 'rack/oauth2/client/grant/client_credentials'
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Rack
|
2
|
+
module OAuth2
|
3
|
+
class Client
|
4
|
+
include AttrRequired, AttrOptional
|
5
|
+
attr_required :identifier
|
6
|
+
attr_optional :secret, :redirect_uri, :scheme, :host, :response_type, :authorize_endpoint, :token_endpoint
|
7
|
+
|
8
|
+
class Exception < StandardError
|
9
|
+
attr_accessor :status, :response
|
10
|
+
def initialize(status, response)
|
11
|
+
@status = status
|
12
|
+
@response = response
|
13
|
+
super response[:error_description]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(attributes = {})
|
18
|
+
(required_attributes + optional_attributes).each do |key|
|
19
|
+
self.send "#{key}=", attributes[key]
|
20
|
+
end
|
21
|
+
@grant = Grant::ClientCredentials.new
|
22
|
+
@authorize_endpoint ||= '/oauth2/authorize'
|
23
|
+
@token_endpoint ||= '/oauth2/token'
|
24
|
+
attr_missing!
|
25
|
+
end
|
26
|
+
|
27
|
+
def authorize_url(response_type = :code, params = {})
|
28
|
+
absolute_url_for authorize_endpoint, params.merge(
|
29
|
+
:client_id => self.identifier,
|
30
|
+
:redirect_uri => self.redirect_uri,
|
31
|
+
:response_type => response_type
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
def authorization_code=(code)
|
36
|
+
@grant = Grant::AuthorizationCode.new(
|
37
|
+
:code => code,
|
38
|
+
:redirect_uri => self.redirect_uri
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
def resource_owner_credentials=(username, password)
|
43
|
+
@grant = Grant::ResourceOwnerCredentials.new(
|
44
|
+
:username => username,
|
45
|
+
:password => password
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
def access_token!
|
50
|
+
params = @grant.to_hash
|
51
|
+
params.merge!(
|
52
|
+
:client_id => self.identifier,
|
53
|
+
:client_secret => self.secret
|
54
|
+
)
|
55
|
+
handle_response do
|
56
|
+
RestClient.post absolute_url_for(token_endpoint), Util.compact_hash(params)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def absolute_url_for(endpoint, params = {})
|
63
|
+
_endpoint_ = Util.parse_uri endpoint
|
64
|
+
_endpoint_.scheme ||= 'https'
|
65
|
+
_endpoint_.host ||= self.host
|
66
|
+
_endpoint_.query = Util.compact_hash(params).to_query
|
67
|
+
_endpoint_.to_s
|
68
|
+
end
|
69
|
+
|
70
|
+
def handle_response
|
71
|
+
response = yield
|
72
|
+
JSON.parse(response.body).with_indifferent_access
|
73
|
+
rescue RestClient::Exception => e
|
74
|
+
error = if e.http_body
|
75
|
+
JSON.parse(e.http_body).with_indifferent_access
|
76
|
+
else
|
77
|
+
{}
|
78
|
+
end
|
79
|
+
raise Exception.new(e.http_code, error)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
require 'rack/oauth2/client/grant'
|
data/lib/rack/oauth2/server.rb
CHANGED
@@ -0,0 +1,47 @@
|
|
1
|
+
module Rack
|
2
|
+
module OAuth2
|
3
|
+
module Util
|
4
|
+
class << self
|
5
|
+
def compact_hash(hash)
|
6
|
+
hash.reject do |key, value|
|
7
|
+
value.blank?
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse_uri(uri)
|
12
|
+
case uri
|
13
|
+
when URI::Generic
|
14
|
+
uri
|
15
|
+
when String
|
16
|
+
URI.parse(uri)
|
17
|
+
else
|
18
|
+
raise "Invalid format of URI is given."
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def redirect_uri(base_uri, location, params)
|
23
|
+
redirect_uri = parse_uri base_uri
|
24
|
+
case location
|
25
|
+
when :query
|
26
|
+
redirect_uri.query = [redirect_uri.query, Util.compact_hash(params).to_query].compact.join('&')
|
27
|
+
when :fragment
|
28
|
+
redirect_uri.fragment = Util.compact_hash(params).to_query
|
29
|
+
end
|
30
|
+
redirect_uri.to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
def uri_match?(base, given)
|
34
|
+
base = parse_uri(base)
|
35
|
+
given = parse_uri(given)
|
36
|
+
base.path = '/' if base.path.blank?
|
37
|
+
given.path = '/' if given.path.blank?
|
38
|
+
[:scheme, :host, :port].all? do |key|
|
39
|
+
base.send(key) == given.send(key)
|
40
|
+
end && /^#{base.path}/ =~ given.path
|
41
|
+
rescue
|
42
|
+
false
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/rack/oauth2.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'rack'
|
2
2
|
require 'json'
|
3
|
+
require 'restclient'
|
3
4
|
require 'active_support/core_ext'
|
4
5
|
require 'attr_required'
|
5
6
|
require 'attr_optional'
|
6
|
-
require 'rack/oauth2/
|
7
|
+
require 'rack/oauth2/util'
|
8
|
+
require 'rack/oauth2/server'
|
9
|
+
require 'rack/oauth2/client'
|
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: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 4
|
9
|
+
- 0
|
10
|
+
version: 0.4.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-03-
|
18
|
+
date: 2011-03-10 00:00:00 +09:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -157,6 +157,11 @@ files:
|
|
157
157
|
- Rakefile
|
158
158
|
- VERSION
|
159
159
|
- lib/rack/oauth2.rb
|
160
|
+
- lib/rack/oauth2/client.rb
|
161
|
+
- lib/rack/oauth2/client/grant.rb
|
162
|
+
- lib/rack/oauth2/client/grant/authorization_code.rb
|
163
|
+
- lib/rack/oauth2/client/grant/client_credentials.rb
|
164
|
+
- lib/rack/oauth2/client/grant/password.rb
|
160
165
|
- lib/rack/oauth2/server.rb
|
161
166
|
- lib/rack/oauth2/server/abstract.rb
|
162
167
|
- lib/rack/oauth2/server/abstract/error.rb
|
@@ -175,7 +180,7 @@ files:
|
|
175
180
|
- lib/rack/oauth2/server/token/error.rb
|
176
181
|
- lib/rack/oauth2/server/token/password.rb
|
177
182
|
- lib/rack/oauth2/server/token/refresh_token.rb
|
178
|
-
- lib/rack/oauth2/
|
183
|
+
- lib/rack/oauth2/util.rb
|
179
184
|
- rack-oauth2.gemspec
|
180
185
|
- spec/rack/oauth2/server/abstract/error_spec.rb
|
181
186
|
- spec/rack/oauth2/server/authorize/code_spec.rb
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module Rack
|
2
|
-
module OAuth2
|
3
|
-
module Server
|
4
|
-
module Util
|
5
|
-
class << self
|
6
|
-
def compact_hash(hash)
|
7
|
-
hash.reject do |key, value|
|
8
|
-
value.blank?
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def parse_uri(uri)
|
13
|
-
case uri
|
14
|
-
when URI::Generic
|
15
|
-
uri
|
16
|
-
when String
|
17
|
-
URI.parse(uri)
|
18
|
-
else
|
19
|
-
raise "Invalid format of URI is given."
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def redirect_uri(base_uri, location, params)
|
24
|
-
redirect_uri = parse_uri base_uri
|
25
|
-
case location
|
26
|
-
when :query
|
27
|
-
redirect_uri.query = [redirect_uri.query, Util.compact_hash(params).to_query].compact.join('&')
|
28
|
-
when :fragment
|
29
|
-
redirect_uri.fragment = Util.compact_hash(params).to_query
|
30
|
-
end
|
31
|
-
redirect_uri.to_s
|
32
|
-
end
|
33
|
-
|
34
|
-
def uri_match?(base, given)
|
35
|
-
base = parse_uri(base)
|
36
|
-
given = parse_uri(given)
|
37
|
-
base.path = '/' if base.path.blank?
|
38
|
-
given.path = '/' if given.path.blank?
|
39
|
-
[:scheme, :host, :port].all? do |key|
|
40
|
-
base.send(key) == given.send(key)
|
41
|
-
end && /^#{base.path}/ =~ given.path
|
42
|
-
rescue
|
43
|
-
false
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|