oauth2_provider 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +94 -0
- data/README.textile +2 -0
- data/app/controllers/oauth2/provider/oauth_authorize_controller.rb +1 -1
- data/app/controllers/oauth2/provider/oauth_clients_controller.rb +4 -2
- data/app/controllers/oauth2/provider/oauth_token_controller.rb +17 -18
- data/app/controllers/oauth2/provider/oauth_user_tokens_controller.rb +3 -3
- data/app/models/oauth2/provider/oauth_authorization.rb +13 -11
- data/app/models/oauth2/provider/oauth_client.rb +20 -10
- data/app/models/oauth2/provider/oauth_token.rb +14 -11
- data/app/views/oauth2/provider/oauth_authorize/index.html.erb +2 -2
- data/app/views/oauth2/provider/oauth_clients/edit.html.erb +11 -11
- data/app/views/oauth2/provider/oauth_clients/index.html.erb +7 -5
- data/app/views/oauth2/provider/oauth_clients/new.html.erb +12 -10
- data/app/views/oauth2/provider/oauth_user_tokens/index.html.erb +2 -2
- data/config/routes.rb +14 -9
- data/generators/oauth2_provider/templates/db/migrate/create_oauth_authorizations.rb +1 -1
- data/generators/oauth2_provider/templates/db/migrate/create_oauth_tokens.rb +1 -1
- data/init.rb +2 -2
- data/lib/oauth2/provider/a_r_datasource.rb +108 -0
- data/lib/oauth2/provider/application_controller_methods.rb +2 -2
- data/lib/oauth2/provider/in_memory_datasource.rb +121 -0
- data/lib/oauth2/provider/model_base.rb +204 -0
- data/lib/oauth2_provider.rb +17 -2
- data/oauth2_provider.gemspec +3 -3
- data/tasks/gem.rake +1 -1
- metadata +7 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,97 @@
|
|
1
|
+
[f15eb88 | Tue Aug 31 23:25:50 UTC 2010] Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
|
2
|
+
|
3
|
+
* Bumping up version number for a 0.2.0 release!
|
4
|
+
|
5
|
+
[05c5534 | Wed Aug 25 17:40:04 UTC 2010] Janmejay Singh <singh.janmejay@gmail.com>
|
6
|
+
|
7
|
+
* plugin when loaded in jruby/rails app(initialized by jruby-rack servlet), in production mode, was failing to find files/load missing constants(even though files are present in path). Fixed the problem by eger loading necessary files.
|
8
|
+
|
9
|
+
[79c14f0 | Mon Aug 23 18:24:17 UTC 2010] David Rice <david.rice@gmail.com>
|
10
|
+
|
11
|
+
* add ids and classes to HTML to allow for styling by host application; remove oauth client show view as it was redundant to the list view
|
12
|
+
|
13
|
+
[0ff4cc7 | Tue Aug 10 21:23:00 UTC 2010] Janmejay Singh <singh.janmejay@gmail.com>
|
14
|
+
|
15
|
+
* allowed silencing 'using datasource...' message by an environment variable, message is shown unless ENV['LOAD_OAUTH_SILENTLY'] is set
|
16
|
+
|
17
|
+
[c59ef9f | Tue Aug 10 20:43:53 UTC 2010] Janmejay Singh <singh.janmejay@gmail.com>
|
18
|
+
|
19
|
+
* added environment variables to make route prefixing possible
|
20
|
+
|
21
|
+
[e051873 | Fri Aug 06 02:18:36 UTC 2010] Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
|
22
|
+
|
23
|
+
* user_id_for_oauth_access_token is nil if the token passed using the 'Authorization' header has expired.
|
24
|
+
|
25
|
+
[740104a | Fri Aug 06 01:19:28 UTC 2010] Janmejay Singh <singh.janmejay@gmail.com>
|
26
|
+
|
27
|
+
* refactored model_base to pick datasource using a method instead of @@datasource, this makes it easy for plugin users to override what datasource instance is used. jruby-rack initializes @app on first request(insteed of servlet initialization), so it is important to do this lazily
|
28
|
+
|
29
|
+
[a3728a9 | Fri Aug 06 01:16:27 UTC 2010] Janmejay Singh <singh.janmejay@gmail.com>
|
30
|
+
|
31
|
+
* user level service approval now has forgery protection enabled + disabled forgery_protection for api request(/oauth/token)
|
32
|
+
|
33
|
+
[2145cd2 | Tue Aug 03 18:15:15 UTC 2010] Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
|
34
|
+
|
35
|
+
* Fixed url munging issues because our model objects are not AR based. Duck typing!!
|
36
|
+
|
37
|
+
[c6d43b3 | Mon Aug 02 17:37:14 UTC 2010] Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
|
38
|
+
|
39
|
+
* KP/WPC -
|
40
|
+
|
41
|
+
* Autodiscover the datasource based on whether ActiveRecord is available.
|
42
|
+
* Default to using InMemoryDatasource if ActiveRecord is not available, and print a warning.
|
43
|
+
|
44
|
+
[ddc56ca | Sat Jul 31 00:55:47 UTC 2010] wpc <alex.hal9000@gmail.com>
|
45
|
+
|
46
|
+
* Specify data type for column for ModelBase. (by default is string type)
|
47
|
+
|
48
|
+
[9546cd7 | Fri Jul 30 23:22:43 UTC 2010] wpc <alex.hal9000@gmail.com>
|
49
|
+
|
50
|
+
* KP/WPC use eval instead of constantize for intiailze custom data source, because constantize dose not work on java class
|
51
|
+
|
52
|
+
[c52a5b6 | Fri Jul 30 23:19:14 UTC 2010] wpc <alex.hal9000@gmail.com>
|
53
|
+
|
54
|
+
* KP/WPC refactoring for removing all find_all_* methods
|
55
|
+
|
56
|
+
[136bca5 | Fri Jul 30 22:57:51 UTC 2010] wpc <alex.hal9000@gmail.com>
|
57
|
+
|
58
|
+
* KP/WPC - removed some find methods.
|
59
|
+
|
60
|
+
[233b20c | Fri Jul 30 22:37:00 UTC 2010] wpc <alex.hal9000@gmail.com>
|
61
|
+
|
62
|
+
* KP/WPC - Add some tests for ModelBase. Removed some redundant tests from oauth_client_test which were really ModelBase tests.
|
63
|
+
|
64
|
+
[5e43b90 | Fri Jul 30 21:05:40 UTC 2010] wpc <alex.hal9000@gmail.com>
|
65
|
+
|
66
|
+
* KP/WPC change expires_at type to integer, so that DataSource don't need to do Date type converting.
|
67
|
+
|
68
|
+
[027ded7 | Fri Jul 30 00:41:36 UTC 2010] Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
|
69
|
+
|
70
|
+
* Renamed a class.
|
71
|
+
|
72
|
+
[31903c2 | Fri Jul 30 00:05:24 UTC 2010] Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
|
73
|
+
|
74
|
+
* KP/WPC - Added an example in memory datasource to store oauth DTO objects.
|
75
|
+
|
76
|
+
[bd4f9db | Thu Jul 29 22:24:06 UTC 2010] Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
|
77
|
+
|
78
|
+
* KP/WPC - Remove all dependencies on AR.
|
79
|
+
|
80
|
+
[cf2b818 | Thu Jul 29 20:53:09 UTC 2010] Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
|
81
|
+
|
82
|
+
* KP/WPC - [cleanup] refactored our classes into their own files.
|
83
|
+
|
84
|
+
[1f8f120 | Thu Jul 29 20:46:36 UTC 2010] Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
|
85
|
+
|
86
|
+
* Remove empty file.
|
87
|
+
|
88
|
+
[4072a40 | Thu Jul 29 19:16:32 UTC 2010] Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
|
89
|
+
|
90
|
+
* KP/WPC - Remove dependency on AR.
|
91
|
+
|
92
|
+
Decouple the OauthClient from AR.
|
93
|
+
Rolled out our own AR 'clone' that delegates DB operations to a DTO behind the source.
|
94
|
+
|
1
95
|
[20b81b6 | Sat Jul 24 00:30:26 UTC 2010] Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
|
2
96
|
|
3
97
|
* Bump up version number for release.
|
data/README.textile
CHANGED
@@ -15,6 +15,8 @@ OAuth is an open-source specification for building a framework for allowing a th
|
|
15
15
|
|
16
16
|
A very good overview of the basic OAuth workflow is "here":http://hueniverse.com/2007/10/beginners-guide-to-oauth-part-ii-protocol-workflow/.
|
17
17
|
|
18
|
+
As some of this is not always easy to grok on first pass, we also put together "some videos":http://www.youtube.com/view_play_list?p=675281900139F609 to give a step-by-step introduction to OAuth.
|
19
|
+
|
18
20
|
Common terms:
|
19
21
|
|
20
22
|
* Provider/Resource Owner - the app that hosts the protected resource. A real world example is Twitter which uses OAuth as the protocol for all its clients.
|
@@ -26,7 +26,8 @@ module Oauth2
|
|
26
26
|
|
27
27
|
if @oauth_client.save
|
28
28
|
flash[:notice] = 'OauthClient was successfully created.'
|
29
|
-
redirect_to
|
29
|
+
redirect_to :action => 'index'
|
30
|
+
return
|
30
31
|
else
|
31
32
|
render :action => "new"
|
32
33
|
end
|
@@ -37,7 +38,8 @@ module Oauth2
|
|
37
38
|
|
38
39
|
if @oauth_client.update_attributes(params[:oauth_client])
|
39
40
|
flash[:notice] = 'OauthClient was successfully updated.'
|
40
|
-
redirect_to
|
41
|
+
redirect_to :action => 'index'
|
42
|
+
return
|
41
43
|
else
|
42
44
|
render :action => "edit"
|
43
45
|
end
|
@@ -4,43 +4,42 @@
|
|
4
4
|
module Oauth2
|
5
5
|
module Provider
|
6
6
|
class OauthTokenController < ApplicationController
|
7
|
+
skip_before_filter :verify_authenticity_token
|
7
8
|
|
8
9
|
def get_token
|
9
10
|
|
10
|
-
authorization = OauthAuthorization.
|
11
|
-
authorization.
|
11
|
+
authorization = OauthAuthorization.find_one(:code, params[:code])
|
12
|
+
authorization.destroy unless authorization.nil?
|
12
13
|
|
13
|
-
original_token = OauthToken.
|
14
|
-
original_token.
|
14
|
+
original_token = OauthToken.find_one(:refresh_token, params[:refresh_token])
|
15
|
+
original_token.destroy unless original_token.nil?
|
15
16
|
|
16
17
|
unless ['authorization-code', 'refresh-token'].include?(params[:grant_type])
|
17
|
-
render_error('unsupported-grant-type')
|
18
|
+
render_error('unsupported-grant-type', "Grant type #{params[:grant_type]} is not supported!")
|
18
19
|
return
|
19
20
|
end
|
20
21
|
|
21
|
-
client = OauthClient.
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
if client.nil?
|
26
|
-
render_error('invalid-client-credentials')
|
22
|
+
client = OauthClient.find_one(:client_id, params[:client_id])
|
23
|
+
|
24
|
+
if client.nil? || client.client_secret != params[:client_secret]
|
25
|
+
render_error('invalid-client-credentials', 'Invalid client credentials!')
|
27
26
|
return
|
28
27
|
end
|
29
28
|
|
30
29
|
if client.redirect_uri != params[:redirect_uri]
|
31
|
-
render_error('invalid-grant')
|
30
|
+
render_error('invalid-grant', 'Redirect uri mismatch!')
|
32
31
|
return
|
33
32
|
end
|
34
33
|
|
35
34
|
if params[:grant_type] == 'authorization-code'
|
36
|
-
if authorization.nil? || authorization.expired? || authorization.oauth_client != client
|
37
|
-
render_error('invalid-grant')
|
35
|
+
if authorization.nil? || authorization.expired? || authorization.oauth_client.id != client.id
|
36
|
+
render_error('invalid-grant', "Authorization expired or invalid!")
|
38
37
|
return
|
39
38
|
end
|
40
39
|
token = authorization.generate_access_token
|
41
40
|
else # refresh-token
|
42
|
-
if original_token.nil? || original_token.oauth_client != client
|
43
|
-
render_error('invalid-grant')
|
41
|
+
if original_token.nil? || original_token.oauth_client.id != client.id
|
42
|
+
render_error('invalid-grant', 'Refresh token is invalid!')
|
44
43
|
return
|
45
44
|
end
|
46
45
|
token = original_token.refresh
|
@@ -50,8 +49,8 @@ module Oauth2
|
|
50
49
|
end
|
51
50
|
|
52
51
|
private
|
53
|
-
def render_error(error_code)
|
54
|
-
render :status => :bad_request, :json => {:error => error_code}.to_json
|
52
|
+
def render_error(error_code, description)
|
53
|
+
render :status => :bad_request, :json => {:error => error_code, :error_description => description}.to_json
|
55
54
|
end
|
56
55
|
|
57
56
|
end
|
@@ -6,7 +6,7 @@ module Oauth2
|
|
6
6
|
class OauthUserTokensController < ApplicationController
|
7
7
|
|
8
8
|
def index
|
9
|
-
@tokens = OauthToken.
|
9
|
+
@tokens = OauthToken.find_all_with(:user_id, current_user_id_for_oauth)
|
10
10
|
end
|
11
11
|
|
12
12
|
def revoke
|
@@ -15,12 +15,12 @@ module Oauth2
|
|
15
15
|
render :text => "User not authorized to perform this action!", :status => :bad_request
|
16
16
|
return
|
17
17
|
end
|
18
|
-
if token.user_id != current_user_id_for_oauth
|
18
|
+
if token.user_id.to_s != current_user_id_for_oauth
|
19
19
|
render :text => "User not authorized to perform this action!", :status => :bad_request
|
20
20
|
return
|
21
21
|
end
|
22
22
|
|
23
|
-
token.
|
23
|
+
token.destroy
|
24
24
|
redirect_to :action => :index
|
25
25
|
end
|
26
26
|
|
@@ -3,32 +3,34 @@
|
|
3
3
|
|
4
4
|
module Oauth2
|
5
5
|
module Provider
|
6
|
-
class OauthAuthorization <
|
6
|
+
class OauthAuthorization < ModelBase
|
7
7
|
|
8
|
-
belongs_to :oauth_client, :class_name => "Oauth2::Provider::OauthClient"
|
9
|
-
|
10
8
|
EXPIRY_TIME = 1.hour
|
11
|
-
|
9
|
+
columns :user_id, :oauth_client_id, :code, :expires_at => :integer
|
10
|
+
|
11
|
+
def oauth_client
|
12
|
+
OauthClient.find_by_id(oauth_client_id)
|
13
|
+
end
|
14
|
+
|
12
15
|
def generate_access_token
|
13
16
|
token = oauth_client.create_token_for_user_id(user_id)
|
14
|
-
self.
|
17
|
+
self.destroy
|
15
18
|
token
|
16
19
|
end
|
17
|
-
|
20
|
+
|
18
21
|
def expires_in
|
19
22
|
(Time.at(expires_at.to_i) - Clock.now).to_i
|
20
23
|
end
|
21
|
-
|
24
|
+
|
22
25
|
def expired?
|
23
26
|
expires_in <= 0
|
24
27
|
end
|
25
|
-
|
26
|
-
protected
|
28
|
+
|
27
29
|
def before_create
|
28
|
-
self.expires_at = Clock.now + EXPIRY_TIME
|
30
|
+
self.expires_at = (Clock.now + EXPIRY_TIME).to_i
|
29
31
|
self.code = ActiveSupport::SecureRandom.hex(32)
|
30
32
|
end
|
31
|
-
|
33
|
+
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
@@ -3,31 +3,41 @@
|
|
3
3
|
|
4
4
|
module Oauth2
|
5
5
|
module Provider
|
6
|
-
class OauthClient <
|
7
|
-
|
6
|
+
class OauthClient < ModelBase
|
7
|
+
|
8
8
|
validates_presence_of :name, :redirect_uri
|
9
|
-
before_create :generate_keys
|
10
|
-
has_many :oauth_tokens, :class_name => "Oauth2::Provider::OauthToken", :dependent => :delete_all
|
11
|
-
has_many :oauth_authorizations, :class_name => "Oauth2::Provider::OauthAuthorization", :dependent => :delete_all
|
12
9
|
validates_format_of :redirect_uri, :with => Regexp.new("^(https|http)://.+$")
|
10
|
+
|
11
|
+
columns :name, :client_id, :client_secret, :redirect_uri
|
13
12
|
|
14
13
|
def create_token_for_user_id(user_id)
|
15
|
-
|
14
|
+
OauthToken.create!(:user_id => user_id, :oauth_client_id => id)
|
16
15
|
end
|
17
16
|
|
18
17
|
def create_authorization_for_user_id(user_id)
|
19
|
-
|
18
|
+
OauthAuthorization.create!(:user_id => user_id, :oauth_client_id => id)
|
20
19
|
end
|
21
|
-
|
22
20
|
def self.model_name
|
23
21
|
ActiveSupport::ModelName.new('OauthClient')
|
24
22
|
end
|
23
|
+
|
24
|
+
def oauth_tokens
|
25
|
+
OauthToken.find_all_with(:oauth_client_id, id)
|
26
|
+
end
|
27
|
+
|
28
|
+
def oauth_authorizations
|
29
|
+
OauthAuthorization.find_all_with(:oauth_client_id, id)
|
30
|
+
end
|
25
31
|
|
26
|
-
|
27
|
-
def generate_keys
|
32
|
+
def before_create
|
28
33
|
self.client_id = ActiveSupport::SecureRandom.hex(32)
|
29
34
|
self.client_secret = ActiveSupport::SecureRandom.hex(32)
|
30
35
|
end
|
36
|
+
|
37
|
+
def before_destroy
|
38
|
+
oauth_tokens.each(&:destroy)
|
39
|
+
oauth_authorizations.each(&:destroy)
|
40
|
+
end
|
31
41
|
|
32
42
|
end
|
33
43
|
end
|
@@ -3,36 +3,39 @@
|
|
3
3
|
|
4
4
|
module Oauth2
|
5
5
|
module Provider
|
6
|
-
class OauthToken <
|
6
|
+
class OauthToken < ModelBase
|
7
|
+
|
8
|
+
columns :user_id, :oauth_client_id, :access_token, :refresh_token, :expires_at => :integer
|
7
9
|
|
8
|
-
belongs_to :oauth_client, :class_name => "Oauth2::Provider::OauthClient"
|
9
|
-
|
10
10
|
EXPIRY_TIME = 90.days
|
11
|
-
|
11
|
+
|
12
|
+
def oauth_client
|
13
|
+
OauthClient.find_by_id(oauth_client_id)
|
14
|
+
end
|
15
|
+
|
12
16
|
def access_token_attributes
|
13
17
|
{:access_token => access_token, :expires_in => expires_in, :refresh_token => refresh_token}
|
14
18
|
end
|
15
|
-
|
19
|
+
|
16
20
|
def expires_in
|
17
21
|
(Time.at(expires_at.to_i) - Clock.now).to_i
|
18
22
|
end
|
19
|
-
|
23
|
+
|
20
24
|
def expired?
|
21
25
|
expires_in <= 0
|
22
26
|
end
|
23
|
-
|
27
|
+
|
24
28
|
def refresh
|
25
|
-
self.
|
29
|
+
self.destroy
|
26
30
|
oauth_client.create_token_for_user_id(user_id)
|
27
31
|
end
|
28
32
|
|
29
|
-
protected
|
30
33
|
def before_create
|
31
34
|
self.access_token = ActiveSupport::SecureRandom.hex(32)
|
32
|
-
self.expires_at = Clock.now + EXPIRY_TIME
|
35
|
+
self.expires_at = (Clock.now + EXPIRY_TIME).to_i
|
33
36
|
self.refresh_token = ActiveSupport::SecureRandom.hex(32)
|
34
37
|
end
|
35
|
-
|
38
|
+
|
36
39
|
end
|
37
40
|
end
|
38
41
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
|
1
|
+
<% form_for(url_for(:action => :authorize), :html => {:id => 'oauth_authorize_form'}) do |f| -%>
|
2
2
|
Do you wish to allow the service named '<%= @client.name %>' to access this application on your behalf? <input type="checkbox" name="authorize" id="authorize" value="1" />
|
3
3
|
<input type="hidden" name="client_id" id="client_id" value="<%= params[:client_id] %>" />
|
4
4
|
<input type="hidden" name="redirect_uri" id="redirect_uri" value="<%= params[:redirect_uri] %>" />
|
5
5
|
<input type="hidden" name="response_type" id="response_type" value="<%= params[:response_type] %>" />
|
6
6
|
<input type="hidden" name="state" id="state" value="<%= params[:state] %>" />
|
7
7
|
<input type="submit" value="Submit" />
|
8
|
-
|
8
|
+
<% end -%>
|
@@ -1,20 +1,20 @@
|
|
1
1
|
<h1>Editing oauth_client</h1>
|
2
2
|
|
3
|
-
<% form_for(@oauth_client) do |f| %>
|
3
|
+
<% form_for(@oauth_client, :html => {:id => 'oauth_client_edit_form', :class => nil}) do |f| %>
|
4
4
|
<%= f.error_messages %>
|
5
5
|
|
6
|
-
<
|
7
|
-
<%= f.label :name
|
6
|
+
<div>
|
7
|
+
<%= f.label :name %>
|
8
8
|
<%= f.text_field :name %>
|
9
|
-
</
|
10
|
-
<
|
11
|
-
<%= f.label :redirect_uri
|
9
|
+
</div>
|
10
|
+
<div>
|
11
|
+
<%= f.label :redirect_uri %>
|
12
12
|
<%= f.text_field :redirect_uri %>
|
13
|
-
</
|
14
|
-
<
|
13
|
+
</div>
|
14
|
+
<div>
|
15
15
|
<%= f.submit 'Update' %>
|
16
|
-
</
|
16
|
+
</div>
|
17
17
|
<% end %>
|
18
18
|
|
19
|
-
<%= link_to 'Show', @oauth_client %> |
|
20
|
-
<%= link_to 'Back', oauth_clients_path %>
|
19
|
+
<%= link_to 'Show', @oauth_client, :class => 'show_link' %> |
|
20
|
+
<%= link_to 'Back', oauth_clients_path, :class => 'back_link' %>
|
@@ -1,11 +1,12 @@
|
|
1
1
|
<h1>Listing oauth_clients</h1>
|
2
2
|
|
3
|
-
<table>
|
3
|
+
<table id="oauth_clients_table" class="list_table">
|
4
4
|
<tr>
|
5
5
|
<th>Name</th>
|
6
6
|
<th>Client id</th>
|
7
7
|
<th>Client secret</th>
|
8
8
|
<th>Redirect URI</th>
|
9
|
+
<th>Actions</th>
|
9
10
|
</tr>
|
10
11
|
|
11
12
|
<% @oauth_clients.each do |oauth_client| %>
|
@@ -14,13 +15,14 @@
|
|
14
15
|
<td><%=h oauth_client.client_id %></td>
|
15
16
|
<td><%=h oauth_client.client_secret %></td>
|
16
17
|
<td><%=h oauth_client.redirect_uri %></td>
|
17
|
-
<td
|
18
|
-
|
19
|
-
|
18
|
+
<td>
|
19
|
+
<%= link_to 'Edit', edit_oauth_client_path(oauth_client), :class => 'edit_link' %>
|
20
|
+
<%= link_to 'Destroy', oauth_client, :confirm => 'Are you sure?', :method => :delete, :class => 'delete_link' %>
|
21
|
+
</td>
|
20
22
|
</tr>
|
21
23
|
<% end %>
|
22
24
|
</table>
|
23
25
|
|
24
26
|
<br />
|
25
27
|
|
26
|
-
<%= link_to 'New oauth_client', new_oauth_client_path %>
|
28
|
+
<%= link_to 'New oauth_client', new_oauth_client_path, :class => 'link_as_button', :id => 'new_oauth_client_button' %>
|
@@ -1,19 +1,21 @@
|
|
1
1
|
<h1>New oauth_client</h1>
|
2
2
|
|
3
|
-
|
3
|
+
<!-- add in an ID for the form -->
|
4
|
+
|
5
|
+
<% form_for(@oauth_client, :html => {:id => 'oauth_client_create_form', :class => nil}) do |f| %>
|
4
6
|
<%= f.error_messages %>
|
5
7
|
|
6
|
-
<
|
7
|
-
<%= f.label :name
|
8
|
+
<div>
|
9
|
+
<%= f.label :name %>
|
8
10
|
<%= f.text_field :name %>
|
9
|
-
</
|
10
|
-
<
|
11
|
-
<%= f.label :redirect_uri
|
11
|
+
</div>
|
12
|
+
<div>
|
13
|
+
<%= f.label :redirect_uri %>
|
12
14
|
<%= f.text_field :redirect_uri %>
|
13
|
-
</
|
14
|
-
<
|
15
|
+
</div>
|
16
|
+
<div>
|
15
17
|
<%= f.submit 'Create' %>
|
16
|
-
</
|
18
|
+
</div>
|
17
19
|
<% end %>
|
18
20
|
|
19
|
-
<%= link_to 'Back', oauth_clients_path %>
|
21
|
+
<%= link_to 'Back', oauth_clients_path, :class => 'back_link' %>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<table>
|
1
|
+
<table id="oauth_user_token_table" class="list_table">
|
2
2
|
<tr>
|
3
3
|
<th>Client</th>
|
4
4
|
<th>Token</th>
|
@@ -8,7 +8,7 @@
|
|
8
8
|
<tr>
|
9
9
|
<td><%= token.oauth_client.name %></td>
|
10
10
|
<td><%= token.access_token %></td>
|
11
|
-
<td><%= link_to('Destroy', {:action => :revoke, :token_id => token.id, :controller => 'Oauth2::Provider::OauthUserTokens'}, {:confirm => 'Are you sure?', :method => :delete})%></td>
|
11
|
+
<td><%= link_to('Destroy', {:action => :revoke, :token_id => token.id, :controller => 'Oauth2::Provider::OauthUserTokens'}, {:confirm => 'Are you sure?', :method => :delete, :class => 'delete_link'})%></td>
|
12
12
|
</tr>
|
13
13
|
<% end -%>
|
14
14
|
</table>
|
data/config/routes.rb
CHANGED
@@ -2,13 +2,18 @@
|
|
2
2
|
# Licenced under the MIT License (http://www.opensource.org/licenses/mit-license.php)
|
3
3
|
|
4
4
|
ActionController::Routing::Routes.draw do |map|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
map.
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
map.connect
|
13
|
-
map.connect
|
5
|
+
|
6
|
+
admin_prefix=ENV['ADMIN_OAUTH_URL_PREFIX']
|
7
|
+
|
8
|
+
map.resources :oauth_clients, :controller => 'Oauth2::Provider::OauthClients', :as => "#{admin_prefix}oauth/clients"
|
9
|
+
|
10
|
+
user_prefix=ENV['USER_OAUTH_URL_PREFIX']
|
11
|
+
|
12
|
+
map.connect "#{user_prefix}/oauth/authorize", :controller => 'Oauth2::Provider::OauthAuthorize', :action => :authorize, :conditions => {:method => :post}
|
13
|
+
map.connect "#{user_prefix}/oauth/authorize", :controller => 'Oauth2::Provider::OauthAuthorize', :action => :index, :conditions => {:method => :get}
|
14
|
+
map.connect "#{user_prefix}/oauth/token", :controller => 'Oauth2::Provider::OauthToken', :action => :get_token, :conditions => {:method => :post}
|
15
|
+
|
16
|
+
map.connect "#{user_prefix}/oauth/user_tokens/revoke/:token_id", :controller => 'Oauth2::Provider::OauthUserTokens', :action => :revoke, :conditions => {:method => :delete}
|
17
|
+
map.connect "#{user_prefix}/oauth/user_tokens", :controller => 'Oauth2::Provider::OauthUserTokens', :action => :index, :conditions => {:method => :get}
|
18
|
+
|
14
19
|
end
|
data/init.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Copyright (c) 2010 ThoughtWorks Inc. (http://thoughtworks.com)
|
2
2
|
# Licenced under the MIT License (http://www.opensource.org/licenses/mit-license.php)
|
3
3
|
|
4
|
-
#
|
5
|
-
|
4
|
+
# !!perform any initialization in oauth2_provider!!
|
5
|
+
require 'oauth2_provider'
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# Copyright (c) 2010 ThoughtWorks Inc. (http://thoughtworks.com)
|
2
|
+
# Licenced under the MIT License (http://www.opensource.org/licenses/mit-license.php)
|
3
|
+
|
4
|
+
if defined?(ActiveRecord)
|
5
|
+
module Oauth2
|
6
|
+
module Provider
|
7
|
+
class ARDatasource
|
8
|
+
|
9
|
+
class OauthClientDto < ActiveRecord::Base
|
10
|
+
set_table_name :oauth_clients
|
11
|
+
end
|
12
|
+
|
13
|
+
class OauthAuthorizationDto < ActiveRecord::Base
|
14
|
+
set_table_name :oauth_authorizations
|
15
|
+
end
|
16
|
+
|
17
|
+
class OauthTokenDto < ActiveRecord::Base
|
18
|
+
set_table_name :oauth_tokens
|
19
|
+
end
|
20
|
+
|
21
|
+
# used in tests, use it to clear datasource
|
22
|
+
def reset
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def find_oauth_client_by_id(id)
|
27
|
+
OauthClientDto.find_by_id(id)
|
28
|
+
end
|
29
|
+
|
30
|
+
def find_oauth_client_by_client_id(client_id)
|
31
|
+
OauthClientDto.find_by_client_id(client_id)
|
32
|
+
end
|
33
|
+
|
34
|
+
def find_all_oauth_client
|
35
|
+
OauthClientDto.all
|
36
|
+
end
|
37
|
+
|
38
|
+
def save_oauth_client(attrs)
|
39
|
+
save(OauthClientDto, attrs)
|
40
|
+
end
|
41
|
+
|
42
|
+
def delete_oauth_client(id)
|
43
|
+
OauthClientDto.delete(id)
|
44
|
+
end
|
45
|
+
|
46
|
+
def find_all_oauth_authorization_by_oauth_client_id(client_id)
|
47
|
+
OauthAuthorizationDto.find_all_by_oauth_client_id(client_id)
|
48
|
+
end
|
49
|
+
|
50
|
+
def find_oauth_authorization_by_id(id)
|
51
|
+
OauthAuthorizationDto.find_by_id(id)
|
52
|
+
end
|
53
|
+
|
54
|
+
def find_oauth_authorization_by_code(code)
|
55
|
+
OauthAuthorizationDto.find_by_code(code)
|
56
|
+
end
|
57
|
+
|
58
|
+
def save_oauth_authorization(attrs)
|
59
|
+
save(OauthAuthorizationDto, attrs)
|
60
|
+
end
|
61
|
+
|
62
|
+
def delete_oauth_authorization(id)
|
63
|
+
OauthAuthorizationDto.delete(id)
|
64
|
+
end
|
65
|
+
|
66
|
+
def find_oauth_token_by_id(id)
|
67
|
+
OauthTokenDto.find_by_id(id)
|
68
|
+
end
|
69
|
+
|
70
|
+
def find_all_oauth_token_by_oauth_client_id(client_id)
|
71
|
+
OauthTokenDto.find_all_by_oauth_client_id(client_id)
|
72
|
+
end
|
73
|
+
|
74
|
+
def find_all_oauth_token_by_user_id(user_id)
|
75
|
+
OauthTokenDto.find_all_by_user_id(user_id)
|
76
|
+
end
|
77
|
+
|
78
|
+
def find_oauth_token_by_access_token(access_token)
|
79
|
+
OauthTokenDto.find_by_access_token(access_token)
|
80
|
+
end
|
81
|
+
|
82
|
+
def find_oauth_token_by_refresh_token(refresh_token)
|
83
|
+
OauthTokenDto.find_by_refresh_token(refresh_token)
|
84
|
+
end
|
85
|
+
|
86
|
+
def save_oauth_token(attrs)
|
87
|
+
save(OauthTokenDto, attrs)
|
88
|
+
end
|
89
|
+
|
90
|
+
def delete_oauth_token(id)
|
91
|
+
OauthTokenDto.delete(id)
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
def save(dto_klass, attrs)
|
97
|
+
dto = dto_klass.find_by_id(attrs[:id])
|
98
|
+
if dto
|
99
|
+
dto.update_attributes(attrs)
|
100
|
+
else
|
101
|
+
dto = dto_klass.create(attrs)
|
102
|
+
end
|
103
|
+
dto
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -29,8 +29,8 @@ module Oauth2
|
|
29
29
|
header_field = request.headers["Authorization"]
|
30
30
|
|
31
31
|
if header_field =~ /Token token="(.*)"/
|
32
|
-
token = OauthToken.
|
33
|
-
token.user_id if token
|
32
|
+
token = OauthToken.find_one(:access_token, $1)
|
33
|
+
token.user_id if (token && !token.expired?)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# Copyright (c) 2010 ThoughtWorks Inc. (http://thoughtworks.com)
|
2
|
+
# Licenced under the MIT License (http://www.opensource.org/licenses/mit-license.php)
|
3
|
+
|
4
|
+
require 'ostruct'
|
5
|
+
module Oauth2
|
6
|
+
module Provider
|
7
|
+
class InMemoryDatasource
|
8
|
+
|
9
|
+
class MyStruct < OpenStruct
|
10
|
+
|
11
|
+
attr_accessor :id
|
12
|
+
|
13
|
+
def initialize(id, attrs)
|
14
|
+
self.id = id
|
15
|
+
super(attrs)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
@@id = 0
|
20
|
+
|
21
|
+
@@oauth_clients = []
|
22
|
+
@@oauth_tokens = []
|
23
|
+
@@oauth_authorizations = []
|
24
|
+
|
25
|
+
def reset
|
26
|
+
@@id = 0
|
27
|
+
@@oauth_clients = []
|
28
|
+
@@oauth_tokens = []
|
29
|
+
@@oauth_authorizations = []
|
30
|
+
end
|
31
|
+
|
32
|
+
def find_oauth_client_by_id(id)
|
33
|
+
@@oauth_clients.find{|i| i.id.to_s == id.to_s}
|
34
|
+
end
|
35
|
+
|
36
|
+
def find_oauth_client_by_client_id(client_id)
|
37
|
+
@@oauth_clients.find{|i| i.client_id.to_s == client_id.to_s}
|
38
|
+
end
|
39
|
+
|
40
|
+
def find_all_oauth_client
|
41
|
+
@@oauth_clients
|
42
|
+
end
|
43
|
+
|
44
|
+
def save_oauth_client(attrs)
|
45
|
+
save(@@oauth_clients, attrs)
|
46
|
+
end
|
47
|
+
|
48
|
+
def delete_oauth_client(id)
|
49
|
+
@@oauth_clients.delete_if {|i| i.id.to_s == id.to_s}
|
50
|
+
end
|
51
|
+
|
52
|
+
def find_all_oauth_authorization_by_oauth_client_id(client_id)
|
53
|
+
@@oauth_authorizations.select {|i| i.oauth_client_id.to_s == client_id.to_s}
|
54
|
+
end
|
55
|
+
|
56
|
+
def find_oauth_authorization_by_id(id)
|
57
|
+
@@oauth_authorizations.find{|i| i.id.to_s == id.to_s}
|
58
|
+
end
|
59
|
+
|
60
|
+
def find_oauth_authorization_by_code(code)
|
61
|
+
@@oauth_authorizations.find{|i| i.code.to_s == code.to_s}
|
62
|
+
end
|
63
|
+
|
64
|
+
def save_oauth_authorization(attrs)
|
65
|
+
save(@@oauth_authorizations, attrs)
|
66
|
+
end
|
67
|
+
|
68
|
+
def delete_oauth_authorization(id)
|
69
|
+
@@oauth_authorizations.delete_if {|i| i.id.to_s == id.to_s}
|
70
|
+
end
|
71
|
+
|
72
|
+
def find_oauth_token_by_id(id)
|
73
|
+
@@oauth_tokens.find{|i| i.id.to_s == id.to_s}
|
74
|
+
end
|
75
|
+
|
76
|
+
def find_all_oauth_token_by_oauth_client_id(client_id)
|
77
|
+
@@oauth_tokens.select {|i| i.oauth_client_id.to_s == client_id.to_s}
|
78
|
+
end
|
79
|
+
|
80
|
+
def find_all_oauth_token_by_user_id(user_id)
|
81
|
+
@@oauth_tokens.select {|i| i.user_id.to_s == user_id.to_s}
|
82
|
+
end
|
83
|
+
|
84
|
+
def find_oauth_token_by_access_token(access_token)
|
85
|
+
@@oauth_tokens.find {|i| i.access_token.to_s == access_token.to_s}
|
86
|
+
end
|
87
|
+
|
88
|
+
def find_oauth_token_by_refresh_token(refresh_token)
|
89
|
+
@@oauth_tokens.find {|i| i.refresh_token.to_s == refresh_token.to_s}
|
90
|
+
end
|
91
|
+
|
92
|
+
def save_oauth_token(attrs)
|
93
|
+
save(@@oauth_tokens, attrs)
|
94
|
+
end
|
95
|
+
|
96
|
+
def delete_oauth_token(id)
|
97
|
+
@@oauth_tokens.delete_if { |i| i.id.to_s == id .to_s}
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
def save(collection, attrs)
|
102
|
+
dto = collection.find {|i| i.id.to_s == attrs[:id].to_s}
|
103
|
+
|
104
|
+
if dto
|
105
|
+
attrs.each do |k, v|
|
106
|
+
dto.send("#{k}=", v)
|
107
|
+
end
|
108
|
+
else
|
109
|
+
dto = MyStruct.new(next_id, attrs)
|
110
|
+
collection << dto
|
111
|
+
end
|
112
|
+
dto
|
113
|
+
end
|
114
|
+
|
115
|
+
def next_id
|
116
|
+
@@id += 1
|
117
|
+
@@id.to_s
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
# Copyright (c) 2010 ThoughtWorks Inc. (http://thoughtworks.com)
|
2
|
+
# Licenced under the MIT License (http://www.opensource.org/licenses/mit-license.php)
|
3
|
+
|
4
|
+
module Oauth2
|
5
|
+
module Provider
|
6
|
+
class NotFoundException < StandardError
|
7
|
+
end
|
8
|
+
|
9
|
+
class RecordNotSaved < StandardError
|
10
|
+
end
|
11
|
+
|
12
|
+
class ModelBase
|
13
|
+
include Validatable
|
14
|
+
CONVERTORS = {
|
15
|
+
:integer => Proc.new { |v| v.to_i },
|
16
|
+
:string => Proc.new { |v| v.to_s }
|
17
|
+
}.with_indifferent_access
|
18
|
+
|
19
|
+
class_inheritable_hash :db_columns
|
20
|
+
self.db_columns = {}
|
21
|
+
|
22
|
+
def self.columns(*names)
|
23
|
+
names.each do |name|
|
24
|
+
column_name, convertor = (Hash === name) ?
|
25
|
+
[name.keys.first, CONVERTORS[name.values.first]] :
|
26
|
+
[name, CONVERTORS[:string]]
|
27
|
+
attr_accessor column_name
|
28
|
+
self.db_columns[column_name.to_s] = convertor
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
columns :id
|
33
|
+
|
34
|
+
def initialize(attributes={})
|
35
|
+
assign_attributes(attributes)
|
36
|
+
end
|
37
|
+
|
38
|
+
cattr_accessor :datasource
|
39
|
+
|
40
|
+
def self.datasource=(ds)
|
41
|
+
@@datasource = case ds
|
42
|
+
when NilClass
|
43
|
+
default_datasource
|
44
|
+
when String
|
45
|
+
eval(ds).new
|
46
|
+
when Class
|
47
|
+
ds.new
|
48
|
+
else
|
49
|
+
ds
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.datasource
|
54
|
+
@@datasource ||= default_datasource
|
55
|
+
end
|
56
|
+
|
57
|
+
def datasource
|
58
|
+
self.class.datasource
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.default_datasource
|
62
|
+
if defined?(ActiveRecord)
|
63
|
+
ARDatasource.new
|
64
|
+
else
|
65
|
+
unless ENV['LOAD_OAUTH_SILENTLY']
|
66
|
+
puts "*"*80
|
67
|
+
puts "*** Activerecord is not defined! Using InMemoryDatasource, which will not persist across application restarts!! ***"
|
68
|
+
puts "*"*80
|
69
|
+
end
|
70
|
+
InMemoryDatasource.new
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.find(id)
|
75
|
+
find_by_id(id) || raise(NotFoundException.new("Record not found!"))
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.find_by_id(id)
|
79
|
+
find_one(:id, id)
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.find_all_with(column_name, column_value)
|
83
|
+
datasource.send("find_all_#{compact_name}_by_#{column_name}", convert(column_name, column_value)).collect do |dto|
|
84
|
+
new.update_from_dto(dto)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.find_one(column_name, column_value)
|
89
|
+
if dto = datasource.send("find_#{compact_name}_by_#{column_name}", convert(column_name, column_value))
|
90
|
+
self.new.update_from_dto(dto)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.all
|
95
|
+
datasource.send("find_all_#{compact_name}").collect do |dto|
|
96
|
+
new.update_from_dto(dto)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.count
|
101
|
+
all.size
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.size
|
105
|
+
all.size
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.compact_name
|
109
|
+
self.name.split('::').last.underscore
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.create(attributes={})
|
113
|
+
client = self.new(attributes)
|
114
|
+
client.save
|
115
|
+
client
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.create!(attributes={})
|
119
|
+
client = self.new(attributes)
|
120
|
+
client.save!
|
121
|
+
client
|
122
|
+
end
|
123
|
+
|
124
|
+
def update_attributes(attributes={})
|
125
|
+
assign_attributes(attributes)
|
126
|
+
save
|
127
|
+
end
|
128
|
+
|
129
|
+
def save!
|
130
|
+
save || raise(RecordNotSaved.new("Could not save model!"))
|
131
|
+
end
|
132
|
+
|
133
|
+
def save
|
134
|
+
before_create if new_record?
|
135
|
+
attrs = db_columns.keys.inject({}) do |result, column_name|
|
136
|
+
result[column_name] = read_attribute(column_name)
|
137
|
+
result
|
138
|
+
end
|
139
|
+
|
140
|
+
if self.valid?
|
141
|
+
dto = datasource.send("save_#{self.class.compact_name}", attrs.with_indifferent_access)
|
142
|
+
update_from_dto(dto)
|
143
|
+
return true
|
144
|
+
end
|
145
|
+
false
|
146
|
+
end
|
147
|
+
|
148
|
+
def reload
|
149
|
+
update_from_dto(self.class.find(id))
|
150
|
+
end
|
151
|
+
|
152
|
+
def destroy
|
153
|
+
before_destroy
|
154
|
+
datasource.send("delete_#{self.class.compact_name}", convert(:id, id) )
|
155
|
+
end
|
156
|
+
|
157
|
+
def before_create
|
158
|
+
# for subclasses to override to support hooks.
|
159
|
+
end
|
160
|
+
|
161
|
+
def before_destroy
|
162
|
+
# for subclasses to override to support hooks.
|
163
|
+
end
|
164
|
+
|
165
|
+
def update_from_dto(dto)
|
166
|
+
db_columns.keys.each do |column_name|
|
167
|
+
write_attribute(column_name, dto.send(column_name))
|
168
|
+
end
|
169
|
+
self
|
170
|
+
end
|
171
|
+
|
172
|
+
def new_record?
|
173
|
+
id.nil?
|
174
|
+
end
|
175
|
+
|
176
|
+
def to_param
|
177
|
+
id.nil? ? nil: id.to_s
|
178
|
+
end
|
179
|
+
|
180
|
+
def assign_attributes(attrs={})
|
181
|
+
attrs.each { |k, v| write_attribute(k, v) }
|
182
|
+
end
|
183
|
+
|
184
|
+
private
|
185
|
+
|
186
|
+
def self.convert(column_name, value)
|
187
|
+
db_columns[column_name.to_s].call(value)
|
188
|
+
end
|
189
|
+
|
190
|
+
def convert(column_name, value)
|
191
|
+
self.class.convert(column_name, value)
|
192
|
+
end
|
193
|
+
|
194
|
+
def read_attribute(column_name)
|
195
|
+
convert(column_name, self.send(column_name))
|
196
|
+
end
|
197
|
+
|
198
|
+
def write_attribute(column_name, value)
|
199
|
+
self.send("#{column_name}=", convert(column_name, value))
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
data/lib/oauth2_provider.rb
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
# Copyright (c) 2010 ThoughtWorks Inc. (http://thoughtworks.com)
|
2
2
|
# Licenced under the MIT License (http://www.opensource.org/licenses/mit-license.php)
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
require 'oauth2/provider/a_r_datasource'
|
5
|
+
require 'oauth2/provider/in_memory_datasource'
|
6
|
+
require 'oauth2/provider/model_base'
|
7
|
+
require 'oauth2/provider/clock'
|
8
|
+
|
9
|
+
Oauth2::Provider::ModelBase.datasource = ENV["OAUTH2_PROVIDER_DATASOURCE"]
|
10
|
+
|
11
|
+
unless ENV['LOAD_OAUTH_SILENTLY']
|
12
|
+
puts "*"*80
|
13
|
+
puts "*** Using data source: #{Oauth2::Provider::ModelBase.datasource.class}"
|
14
|
+
puts "*"*80
|
15
|
+
end
|
16
|
+
|
17
|
+
Dir[File.join(File.dirname(__FILE__), "..", "app", "**", '*.rb')].each do |rb_file|
|
18
|
+
require File.expand_path(rb_file)
|
19
|
+
end
|
20
|
+
|
data/oauth2_provider.gemspec
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{oauth2_provider}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.2.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["ThoughtWorks, Inc."]
|
9
|
-
s.date = %q{2010-
|
9
|
+
s.date = %q{2010-08-31}
|
10
10
|
s.description = %q{A Rails plugin to OAuth v2.0 enable your rails application. This plugin implements v09 of the OAuth2 draft spec http://tools.ietf.org/html/draft-ietf-oauth-v2-09.}
|
11
11
|
s.email = %q{ketan@thoughtworks.com}
|
12
12
|
s.extra_rdoc_files = ["README.textile", "MIT-LICENSE.txt"]
|
13
|
-
s.files = ["app/controllers/oauth2/provider/oauth_authorize_controller.rb", "app/controllers/oauth2/provider/oauth_clients_controller.rb", "app/controllers/oauth2/provider/oauth_token_controller.rb", "app/controllers/oauth2/provider/oauth_user_tokens_controller.rb", "app/models/oauth2/provider/oauth_authorization.rb", "app/models/oauth2/provider/oauth_client.rb", "app/models/oauth2/provider/oauth_token.rb", "app/views/oauth2/provider/layouts/oauth_clients.html.erb", "app/views/oauth2/provider/oauth_authorize/index.html.erb", "app/views/oauth2/provider/oauth_clients/edit.html.erb", "app/views/oauth2/provider/oauth_clients/index.html.erb", "app/views/oauth2/provider/oauth_clients/new.html.erb", "app/views/oauth2/provider/oauth_clients/show.html.erb", "app/views/oauth2/provider/oauth_user_tokens/index.html.erb", "config/routes.rb", "generators/oauth2_provider/oauth2_provider_generator.rb", "generators/oauth2_provider/templates/config/initializers/oauth2_provider.rb", "generators/oauth2_provider/templates/db/migrate/create_oauth_authorizations.rb", "generators/oauth2_provider/templates/db/migrate/create_oauth_clients.rb", "generators/oauth2_provider/templates/db/migrate/create_oauth_tokens.rb", "init.rb", "lib/oauth2/provider/application_controller_methods.rb", "lib/oauth2/provider/clock.rb", "lib/oauth2_provider.rb", "MIT-LICENSE.txt", "oauth2_provider.gemspec", "README.textile", "tasks/gem.rake", "CHANGELOG"]
|
13
|
+
s.files = ["app/controllers/oauth2/provider/oauth_authorize_controller.rb", "app/controllers/oauth2/provider/oauth_clients_controller.rb", "app/controllers/oauth2/provider/oauth_token_controller.rb", "app/controllers/oauth2/provider/oauth_user_tokens_controller.rb", "app/models/oauth2/provider/oauth_authorization.rb", "app/models/oauth2/provider/oauth_client.rb", "app/models/oauth2/provider/oauth_token.rb", "app/views/oauth2/provider/layouts/oauth_clients.html.erb", "app/views/oauth2/provider/oauth_authorize/index.html.erb", "app/views/oauth2/provider/oauth_clients/edit.html.erb", "app/views/oauth2/provider/oauth_clients/index.html.erb", "app/views/oauth2/provider/oauth_clients/new.html.erb", "app/views/oauth2/provider/oauth_clients/show.html.erb", "app/views/oauth2/provider/oauth_user_tokens/index.html.erb", "config/routes.rb", "generators/oauth2_provider/oauth2_provider_generator.rb", "generators/oauth2_provider/templates/config/initializers/oauth2_provider.rb", "generators/oauth2_provider/templates/db/migrate/create_oauth_authorizations.rb", "generators/oauth2_provider/templates/db/migrate/create_oauth_clients.rb", "generators/oauth2_provider/templates/db/migrate/create_oauth_tokens.rb", "init.rb", "lib/oauth2/provider/a_r_datasource.rb", "lib/oauth2/provider/application_controller_methods.rb", "lib/oauth2/provider/clock.rb", "lib/oauth2/provider/in_memory_datasource.rb", "lib/oauth2/provider/model_base.rb", "lib/oauth2_provider.rb", "MIT-LICENSE.txt", "oauth2_provider.gemspec", "README.textile", "tasks/gem.rake", "CHANGELOG"]
|
14
14
|
s.homepage = %q{http://github.com/ThoughtWorksStudios/oauth2_provider}
|
15
15
|
s.require_paths = ["lib"]
|
16
16
|
s.rubygems_version = %q{1.3.7}
|
data/tasks/gem.rake
CHANGED
@@ -35,7 +35,7 @@ namespace :release do
|
|
35
35
|
|
36
36
|
spec = Gem::Specification.new do |s|
|
37
37
|
s.name = "oauth2_provider"
|
38
|
-
s.version = "0.
|
38
|
+
s.version = "0.2.0"
|
39
39
|
s.author = "ThoughtWorks, Inc."
|
40
40
|
s.email = "ketan@thoughtworks.com"
|
41
41
|
s.homepage = "http://github.com/ThoughtWorksStudios/oauth2_provider"
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oauth2_provider
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- ThoughtWorks, Inc.
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-08-31 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -50,8 +50,11 @@ files:
|
|
50
50
|
- generators/oauth2_provider/templates/db/migrate/create_oauth_clients.rb
|
51
51
|
- generators/oauth2_provider/templates/db/migrate/create_oauth_tokens.rb
|
52
52
|
- init.rb
|
53
|
+
- lib/oauth2/provider/a_r_datasource.rb
|
53
54
|
- lib/oauth2/provider/application_controller_methods.rb
|
54
55
|
- lib/oauth2/provider/clock.rb
|
56
|
+
- lib/oauth2/provider/in_memory_datasource.rb
|
57
|
+
- lib/oauth2/provider/model_base.rb
|
55
58
|
- lib/oauth2_provider.rb
|
56
59
|
- MIT-LICENSE.txt
|
57
60
|
- oauth2_provider.gemspec
|