opro 0.0.1.pre → 0.0.1.pre1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,27 +1,17 @@
1
1
  ## Stop, Read This
2
2
 
3
- This is my first time writing and Oauth Provider, so there may be buggy or insecure code. If you want to use this, do so at your own risk. I'm vetting it on some development and production applications, when it is ready for consumption and contribution, i'll remove this. If you want to be notified when that happens let me know [@schneems](http://twitter.com/schneems). For now this should be considered a toy, and enjoyed as such :)
3
+ If you want to use this, do so at your own risk. I'm vetting it on some development and production applications, when it is ready for consumption and contribution, I'll remove this. If you want to be notified when that happens let me know [@schneems](http://twitter.com/schneems). For now this should be considered a toy, and enjoyed as such :)
4
4
 
5
5
  ## Opro
6
6
 
7
7
  A Rails Engine that turns your app into an [Oauth](http://oauth.net/2/) Provider.
8
8
 
9
-
10
- ## What is an Oauth Provider
11
-
12
- Oauth is used all over the web by apps that need to authenticate users or restrict access to information in a secure fashion. Twitter and Facebook are the best known Oauth Providers. Users click "connect to Twitter" in an iPhone app, then they're sent over to Twitter's site where they can accept or deny access. From there they're sent back to the iPhone app where they can do anything through the API that they would be allowed to do in the website.
13
-
14
- Most users understand the flow pretty well, it's a fairly standard process, and is secure. While there are plenty of Oauth client libraries unfortunately it's not super easy to implement from a provider standpoint. Since I hate writing code twice, I decided to take an Oauth Provider and turn it into a Rails Engine so anyone could implement an Oauth Provider on their site.
15
-
16
9
  ## Why would I use this?
17
10
 
18
11
  Lets say you've built a Rails app, awesome. Now you want to build a mobile app on say, the iPhone; cool. You start throwing around `#to_json` like nobody's business, but then you realize you need to authenticate users somehow. "Basic Auth!!", you exclaim, but then you realize that's not the most secure solution. You also realize that some users already signed up with Facebook & Twitter so they don't have a username/password combo. What ever shall you do?
19
12
 
20
13
  Wouldn't it be great if we could have a token exchange where the user goes to a mobile web view and grants permission, and then we return back an auth token just like the big boys (Facebook, Twitter, *cough* Foursquare *cough*). With Opro, we can add this functionality pretty easily. We'll use your existing authentication strategy and provide some end integration points for your clients to use out of the box.
21
14
 
22
- ## Sounds Hard
23
-
24
- It's not, just follow the directions below. I'll add a screencast and example app when I get time. Any questions, open an issue or ping me on Twitter.
25
15
 
26
16
  ## Install
27
17
 
@@ -31,16 +21,31 @@ Gemfile
31
21
  gem 'opro'
32
22
  ```
33
23
 
24
+ Then run
25
+
34
26
  ```shell
35
27
  $ bundle install
36
28
  ```
37
29
 
30
+ and don't forget
31
+
38
32
  ```shell
39
- $ opro:install
33
+ $ rails g opro:install
40
34
  ```
41
35
 
42
36
  This will put a file in `initializers/opro.rb` and generate some migrations.
43
37
 
38
+
39
+ Now we're ready to migrate the database
40
+
41
+ ```shell
42
+ $ rake db:migrate
43
+ ````
44
+
45
+ This will add `Oauth::AccessGrant` and `Oauth::ClientApplication` to your database
46
+
47
+ ## Setup
48
+
44
49
  Go to `initializers/opro.rb` and configure your app for your authentication scheme.
45
50
 
46
51
  ```ruby
@@ -59,20 +64,32 @@ If you're not using devise you can manually configure your own auth strategy. In
59
64
  end
60
65
  ```
61
66
 
62
- Now we're ready to migrate the database
67
+ Now in your controllers you can allow OAuth access using the same syntax of the rails `before_filter`
68
+
69
+ ```ruby
70
+ class UsersController < ApplicationController
71
+ allow_oauth! :only => [:show]
72
+ end
73
+ ```
74
+
75
+
76
+ You can also disallow OAuth on specific actions. Disallowing will always over-ride allowing.
63
77
 
64
- ```shell
65
- $ rake db:migrate
66
- ````
67
78
 
79
+ ```ruby
80
+ class ProductsController < ApplicationController
81
+ disallow_oauth! :only => [:create]
82
+ end
83
+ ```
68
84
 
85
+ By default all OAuth access is blacklisted. To whitelist all access, add `allow_oauth!` to your `ApplicationController` (this is not recommended). The best practice is to add allow or disallow code to each controller.
69
86
 
70
87
  That should be all you need to do to get setup, congrats you're now able to authenticate users using OAuth!!
71
88
 
72
89
 
73
90
  ## Use it
74
91
 
75
- Opro comes with built in documentation, so if you start your server you can view them at `/docs/oauth`. If you're reading this on Github you can jump right to the [Quick Start](/app/views/docs/markdown/quick_start.md) guide. This guide will walk you through creating your first Oauth client application, giving access to that app as a logged in user, getting an access token for that user, and using that token to access the server as an authenticated user!
92
+ Opro comes with built in documentation, so if you start your server you can view them at http://localhost:3000/oauth_docs. If you're reading this on Github you can jump right to the [Quick Start](https://github.com/schneems/opro/blob/master/app/views/oauth/docs/markdown/quick_start.md.erb) guide. This guide will walk you through creating your first OAuth client application, giving access to that app as a logged in user, getting an access token for that user, and using that token to access the server as an authenticated user!
76
93
 
77
94
 
78
95
  ## Assumptions
data/Rakefile CHANGED
@@ -40,7 +40,7 @@ Jeweler::Tasks.new do |gem|
40
40
  gem.homepage = "http://github.com/schneems/opro"
41
41
  gem.license = "MIT"
42
42
  gem.summary = %Q{ Opro turns your Rails application into an OAuth Provider }
43
- gem.description = %Q{ Enable oauth clients (iphone, android, web sites, etc.) to access and use your Rails application, what you do with it is up to you}
43
+ gem.description = %Q{ Enable OAuth clients (iphone, android, web sites, etc.) to access and use your Rails application, what you do with it is up to you}
44
44
  gem.email = "richard.schneeman@gmail.com"
45
45
  gem.authors = ["schneems"]
46
46
  # dependencies defined in Gemfile
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1.pre
1
+ 0.0.1.pre1.0.1
@@ -0,0 +1,53 @@
1
+ class Oauth::TestsController < ApplicationController
2
+ allow_oauth!
3
+ disallow_oauth! :only => [:destroy]
4
+
5
+ def index
6
+
7
+ end
8
+
9
+ def show
10
+ result = if valid_oauth?
11
+ {:status => 200, :message => 'OAuth Worked!!', :params => params, :user_id => oauth_user.id }
12
+ else
13
+ {:status => 401, :message => "OAuth Did not Work :( #{generate_oauth_error_message!}", :params => params}
14
+ end
15
+
16
+ respond_to do |format|
17
+ format.html do
18
+ render :text => result.to_json, :status => result[:status], :layout => true
19
+ end
20
+ format.json do
21
+ render :json => result, :status => result[:status]
22
+ end
23
+ end
24
+ end
25
+
26
+ def destroy
27
+ result = if valid_oauth?
28
+ {:status => 200, :message => 'OHNO!!! OAuth is Disabled on this Action, this is bad', :params => params}
29
+ else
30
+ {:status => 401, :message => "Oauth is Disabled on this Action, this is the correct result!", :params => params}
31
+ end
32
+
33
+ respond_to do |format|
34
+ format.html do
35
+ render :text => result.to_json, :status => result[:status], :layout => true
36
+ end
37
+ format.json do
38
+ render :json => result, :status => result[:status]
39
+ end
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def generate_oauth_error_message!
46
+ msg = ""
47
+ msg << ' - No OAuth Token Provided!' if params[:access_token].blank?
48
+ msg << ' - Allow OAuth set to false!' if allow_oauth? == false
49
+ msg << ' - OAuth user not found!' if oauth_user.blank?
50
+ msg
51
+ end
52
+
53
+ end
@@ -3,7 +3,7 @@
3
3
  <%= form_for @client_app do |f| %>
4
4
  <%= f.label :name %>:
5
5
  <%= f.text_field :name, :placeholder => 'App Name' %>
6
- <%= f.submit 'Create Oauth Client', :id => 'submitApp' %>
6
+ <%= f.submit 'Create OAuth Client', :id => 'submitApp' %>
7
7
  <%- end -%>
8
8
  </div>
9
9
 
@@ -1 +1,3 @@
1
- Oauth is ... TODO
1
+ Oauth is ... TODO
2
+
3
+ <%= link_to "Facebook's Server Side OAuth Authentication", 'http://developers.facebook.com/docs/authentication/server-side/'%>
@@ -2,6 +2,7 @@
2
2
 
3
3
  This site is providing OAuth through [Opro](http://github.com/schneems/opro). If this is your first time using Oauth, please visit [What is Oauth]() or follow along with this guide.
4
4
 
5
+
5
6
  ## Step 1: Register your Application
6
7
 
7
8
  Sign in as a registered user then visit the [new client application page](/oauth_client_applications/new). Enter in the name of your application for this example we can use `foo`, you can change this later if you desire. Hit enter and you should see a screen that has your application name along with a `client id` and a `secret`, these behave like a username and password for your OAuth application.
@@ -19,20 +20,19 @@ Once you've registered an app successfully we can start to build an OAuth applic
19
20
 
20
21
  Now that you have a client id, you'll want to give it access to a user account. Open a new browser window with your currently logged in account, then give your application permission by visiting the url below (please swap out '3234myClientId5678' for your client id)
21
22
 
22
- <%= "#{request.base_url}/oauth/authorize?" %>client_id=3234myClientId5678&redirect_uri=/
23
+ <%= "#{request.base_url}/oauth/authorize?" %>client_id=3234myClientId5678&redirect_uri=%2F
23
24
 
24
25
  This should land you on a page asking if you would like to grant permission to the application. If not, make sure you're logged in and you put the correct client id in the url.
25
26
 
26
27
  Once you grant your application permission, you will be redirected back to the url provided. In this case we will go back to the home page of our app.
27
28
 
28
- Once redirected to the home page take a look in the address bar, we should see a `code` parameter. Copy this for use later:
29
+ Once redirected to the home page, take a look in the address bar, we should see a `code` parameter. Copy this for use later:
29
30
 
30
31
  <%= "#{request.base_url}?" %>?code=4857goldfish827423
31
32
 
32
33
  In the url above the `code` would be `4857goldfish827423`. This code can be used to obtain an access token for the user. Once you have a user's access token, you can perform actions for the user as if they were logged in. If you accidentally close this page, don't worry just visit first url and we'll show you the code again.
33
34
 
34
35
 
35
-
36
36
  ## Step 3: Get AccessToken for User with Curl
37
37
 
38
38
  We'll be using [Curl]() to go through the process of getting an access for our first user, you'll likely use http client libraries in your actual applications, but most systems come with curl and it is a fairly easy way to get started. If you've never used it before read our [curl documentation]()
@@ -52,19 +52,20 @@ You should get back a response that looks like this
52
52
  If not, double check the previous steps and ensure you are using the correct values in the query. Copy the `access_token` we'll use it for the rest of our application, in this example it is `9693accessTokena7ca570bbaf`. Treat this access_token as if it were the user's password. It is sensitive information.
53
53
 
54
54
 
55
- Step 4: Use the access token
55
+ ## Step 4: Use the access token
56
56
 
57
57
  Now we've gone through all the hard work of getting this token, you can use it to make authenticated requests to the server. You'll just need to include the correct `access_token` parameter in your query and you'll be logged in as that user for that request.
58
58
 
59
-
60
59
  Try it out for yourself open up a browser and go to
61
60
 
61
+ <%= "#{request.base_url}/oauth_test/show_me_the_money?access_token=9693accessTokena7ca570bbaf" %>
62
62
 
63
- <%= "#{request.base_url}/oauth/access_token?" %>
64
63
 
64
+ You should see a successful result ( again don't forget to replace the example access token with yours ). Not all urls will support OAuth authentication.
65
65
 
66
66
  ## Security
67
67
 
68
-
69
68
  Don't share your client application's secret or any user's access_token with unknown or untrusted parties. Always use https when available and don't write any of these values to your application's logs.
70
69
 
70
+
71
+ <%= view_context.link_to ' ← back', oauth_docs_path %>
@@ -0,0 +1,31 @@
1
+ <h2>Oauth Test</h2>
2
+
3
+ <p>Use this url scheme to test your OAuth application</p>
4
+
5
+ <h2>Test OAuth Allow</h2>
6
+
7
+ <p>
8
+ If you send a valid OAuth request to any oauth_test url such as <%= link_to oauth_test_path(:show_me_the_money), oauth_test_path(:show_me_the_money) %> you should see a response like this
9
+ </p>
10
+ <pre>
11
+ <code>
12
+ <%= {:status => 200, :message => 'Oauth Worked!! ', :params => {:id => 'show_me_the_money', :access_token => '3948fuAlo10gnsu'} }.to_json %>
13
+ </code>
14
+ </pre>
15
+ <p>
16
+ If the request is not valid you will receive a message detailing the errors.
17
+ </p>
18
+
19
+ <h2>Test OAuth Disallow</h2>
20
+ <p>
21
+ If you send a valid OAuth request using the 'DELETE' HTTP method to <%= oauth_test_path(:show_me_the_money) %> you should see a response like below.</p>
22
+ <%= button_to oauth_test_path(:show_me_the_money), oauth_test_path(:show_me_the_money), :method => :delete %>
23
+ <pre>
24
+ <code>
25
+ <%= {:status => 401, :message => 'Oauth is Disabled on this Action, this is the correct result!', :params => {:id => 'show_me_the_money', :access_token => '3948fuAlo10gnsu'}}.to_json %>
26
+ </code>
27
+ </pre>
28
+
29
+ <p>
30
+ If you get a 200 result, then there is something configured incorrectly on the server, please contact the administrator.
31
+ </p>
data/config/routes.rb CHANGED
@@ -5,5 +5,6 @@ Rails.application.routes.draw do
5
5
  match '/oauth/access_token' => 'oauth/auth#access_token', :as => 'oauth_token'
6
6
 
7
7
  resources :oauth_docs, :controller => 'oauth/docs'
8
+ resources :oauth_tests, :controller => 'oauth/tests'
8
9
  resources :oauth_client_applications, :controller => 'oauth/client_application'
9
10
  end
@@ -4,7 +4,7 @@ module Opro
4
4
  module Controllers
5
5
  module ApplicationControllerHelper
6
6
  extend ActiveSupport::Concern
7
-
7
+
8
8
  included do
9
9
  around_filter :oauth_auth!
10
10
  skip_before_filter :verify_authenticity_token, :if => :valid_oauth?
@@ -14,9 +14,33 @@ module Opro
14
14
  Opro.authenticate_user_method.call(self)
15
15
  end
16
16
 
17
+ module ClassMethods
18
+ def allow_oauth!(options = {})
19
+ prepend_before_filter :allow_oauth, options
20
+ end
21
+
22
+ def disallow_oauth!(options = {})
23
+ prepend_before_filter :disallow_oauth, options
24
+ skip_before_filter :allow_oauth, options
25
+ end
26
+ end
27
+
17
28
  protected
29
+
30
+ def allow_oauth?
31
+ @use_oauth ||= false
32
+ end
33
+
34
+ def disallow_oauth
35
+ @use_oauth = false
36
+ end
37
+
38
+ def allow_oauth
39
+ @use_oauth = true
40
+ end
41
+
18
42
  def oauth?
19
- params[:access_token].present?
43
+ allow_oauth? && params[:access_token].present?
20
44
  end
21
45
 
22
46
  def oauth_user
data/opro.gemspec CHANGED
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "opro"
8
- s.version = "0.0.1.pre"
8
+ s.version = "0.0.1.pre1.0.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["schneems"]
12
12
  s.date = "2012-04-10"
13
- s.description = " Enable oauth clients (iphone, android, web sites, etc.) to access and use your Rails application, what you do with it is up to you"
13
+ s.description = " Enable OAuth clients (iphone, android, web sites, etc.) to access and use your Rails application, what you do with it is up to you"
14
14
  s.email = "richard.schneeman@gmail.com"
15
15
  s.extra_rdoc_files = [
16
16
  "README.md"
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
26
26
  "app/controllers/oauth/auth_controller.rb",
27
27
  "app/controllers/oauth/client_application_controller.rb",
28
28
  "app/controllers/oauth/docs_controller.rb",
29
+ "app/controllers/oauth/tests_controller.rb",
29
30
  "app/controllers/opro_application_controller.rb",
30
31
  "app/models/oauth/access_grant.rb",
31
32
  "app/models/oauth/client_application.rb",
@@ -38,6 +39,7 @@ Gem::Specification.new do |s|
38
39
  "app/views/oauth/docs/markdown/oauth.md.erb",
39
40
  "app/views/oauth/docs/markdown/quick_start.md.erb",
40
41
  "app/views/oauth/docs/show.html.erb",
42
+ "app/views/oauth/tests/index.html.erb",
41
43
  "config/routes.rb",
42
44
  "lib/generators/active_record/opro_generator.rb",
43
45
  "lib/generators/active_record/templates/access_grants.rb",
@@ -1,3 +1,6 @@
1
1
  class ApplicationController < ActionController::Base
2
2
  protect_from_forgery
3
+
4
+ allow_oauth!
5
+
3
6
  end
@@ -14,4 +14,8 @@ class OauthTest < ActiveSupport::IntegrationCase
14
14
  visit "/?access_token=#{access_token}"
15
15
  assert has_content?('User is logged in')
16
16
  end
17
+
18
+ test 'blacklisted route should not show user logged in' do
19
+ #TODO
20
+ end
17
21
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.pre
4
+ version: 0.0.1.pre1.0.1
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-04-10 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &70329431198240 !ruby/object:Gem::Requirement
16
+ requirement: &70203502493160 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.0.7
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70329431198240
24
+ version_requirements: *70203502493160
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rails
27
- requirement: &70329431197140 !ruby/object:Gem::Requirement
27
+ requirement: &70203502491540 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.0.7
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70329431197140
35
+ version_requirements: *70203502491540
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bluecloth
38
- requirement: &70329431196460 !ruby/object:Gem::Requirement
38
+ requirement: &70203502490520 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70329431196460
46
+ version_requirements: *70203502490520
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: jeweler
49
- requirement: &70329431195780 !ruby/object:Gem::Requirement
49
+ requirement: &70203502489320 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.6.4
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70329431195780
57
+ version_requirements: *70203502489320
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bundler
60
- requirement: &70329431195160 !ruby/object:Gem::Requirement
60
+ requirement: &70203502488240 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.1.3
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70329431195160
68
+ version_requirements: *70203502488240
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: capybara
71
- requirement: &70329431194500 !ruby/object:Gem::Requirement
71
+ requirement: &70203502486620 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.4.0
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70329431194500
79
+ version_requirements: *70203502486620
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: sqlite3
82
- requirement: &70329431193900 !ruby/object:Gem::Requirement
82
+ requirement: &70203502485440 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70329431193900
90
+ version_requirements: *70203502485440
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: launchy
93
- requirement: &70329431193160 !ruby/object:Gem::Requirement
93
+ requirement: &70203502466260 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70329431193160
101
+ version_requirements: *70203502466260
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: devise
104
- requirement: &70329431192520 !ruby/object:Gem::Requirement
104
+ requirement: &70203502464720 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70329431192520
112
+ version_requirements: *70203502464720
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rcov
115
- requirement: &70329431191660 !ruby/object:Gem::Requirement
115
+ requirement: &70203502462100 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *70329431191660
123
+ version_requirements: *70203502462100
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: simplecov
126
- requirement: &70329431190860 !ruby/object:Gem::Requirement
126
+ requirement: &70203502460760 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,8 +131,8 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *70329431190860
135
- description: ! ' Enable oauth clients (iphone, android, web sites, etc.) to access
134
+ version_requirements: *70203502460760
135
+ description: ! ' Enable OAuth clients (iphone, android, web sites, etc.) to access
136
136
  and use your Rails application, what you do with it is up to you'
137
137
  email: richard.schneeman@gmail.com
138
138
  executables: []
@@ -150,6 +150,7 @@ files:
150
150
  - app/controllers/oauth/auth_controller.rb
151
151
  - app/controllers/oauth/client_application_controller.rb
152
152
  - app/controllers/oauth/docs_controller.rb
153
+ - app/controllers/oauth/tests_controller.rb
153
154
  - app/controllers/opro_application_controller.rb
154
155
  - app/models/oauth/access_grant.rb
155
156
  - app/models/oauth/client_application.rb
@@ -162,6 +163,7 @@ files:
162
163
  - app/views/oauth/docs/markdown/oauth.md.erb
163
164
  - app/views/oauth/docs/markdown/quick_start.md.erb
164
165
  - app/views/oauth/docs/show.html.erb
166
+ - app/views/oauth/tests/index.html.erb
165
167
  - config/routes.rb
166
168
  - lib/generators/active_record/opro_generator.rb
167
169
  - lib/generators/active_record/templates/access_grants.rb
@@ -235,7 +237,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
235
237
  version: '0'
236
238
  segments:
237
239
  - 0
238
- hash: 3465543543531569023
240
+ hash: -607479715438649741
239
241
  required_rubygems_version: !ruby/object:Gem::Requirement
240
242
  none: false
241
243
  requirements: