simple_oauth2 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.codeclimate.yml +25 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +26 -0
- data/.hound.yml +4 -0
- data/.rubocop.yml +5 -0
- data/.rubocop_todo.yml +12 -0
- data/.travis.yml +31 -0
- data/Gemfile +18 -0
- data/LICENSE +21 -0
- data/README.md +11 -0
- data/Rakefile +11 -0
- data/gemfiles/nobrainer.rb +15 -0
- data/lib/simple_oauth2/configuration/class_accessors.rb +36 -0
- data/lib/simple_oauth2/configuration/constants.rb +36 -0
- data/lib/simple_oauth2/configuration.rb +169 -0
- data/lib/simple_oauth2/generators/authorization.rb +64 -0
- data/lib/simple_oauth2/generators/base.rb +31 -0
- data/lib/simple_oauth2/generators/token.rb +71 -0
- data/lib/simple_oauth2/helpers.rb +40 -0
- data/lib/simple_oauth2/mixins/nobrainer/access_grant.rb +62 -0
- data/lib/simple_oauth2/mixins/nobrainer/access_token.rb +98 -0
- data/lib/simple_oauth2/mixins/nobrainer/client.rb +43 -0
- data/lib/simple_oauth2/resource/bearer.rb +20 -0
- data/lib/simple_oauth2/responses.rb +62 -0
- data/lib/simple_oauth2/scopes.rb +59 -0
- data/lib/simple_oauth2/strategies/authorization_code.rb +22 -0
- data/lib/simple_oauth2/strategies/base.rb +61 -0
- data/lib/simple_oauth2/strategies/client_credentials.rb +21 -0
- data/lib/simple_oauth2/strategies/code.rb +25 -0
- data/lib/simple_oauth2/strategies/password.rb +21 -0
- data/lib/simple_oauth2/strategies/refresh_token.rb +53 -0
- data/lib/simple_oauth2/strategies/token.rb +24 -0
- data/lib/simple_oauth2/uniq_token.rb +20 -0
- data/lib/simple_oauth2/version.rb +26 -0
- data/lib/simple_oauth2.rb +62 -0
- data/logo.png +0 -0
- data/simple_oauth2.gemspec +22 -0
- data/spec/configuration/config_spec.rb +181 -0
- data/spec/configuration/version_spec.rb +11 -0
- data/spec/dummy/endpoints/authorization.rb +15 -0
- data/spec/dummy/endpoints/custom_authorization.rb +21 -0
- data/spec/dummy/endpoints/custom_token.rb +21 -0
- data/spec/dummy/endpoints/status.rb +51 -0
- data/spec/dummy/endpoints/token.rb +22 -0
- data/spec/dummy/orm/nobrainer/app/config/db.rb +8 -0
- data/spec/dummy/orm/nobrainer/app/models/access_grant.rb +3 -0
- data/spec/dummy/orm/nobrainer/app/models/access_token.rb +3 -0
- data/spec/dummy/orm/nobrainer/app/models/client.rb +3 -0
- data/spec/dummy/orm/nobrainer/app/models/user.rb +11 -0
- data/spec/dummy/orm/nobrainer/app/twitter.rb +51 -0
- data/spec/dummy/orm/nobrainer/config.ru +37 -0
- data/spec/dummy/simple_oauth2_config.rb +7 -0
- data/spec/requests/flows/authorization_code_spec.rb +177 -0
- data/spec/requests/flows/client_credentials_spec.rb +163 -0
- data/spec/requests/flows/code_spec.rb +98 -0
- data/spec/requests/flows/password_spec.rb +183 -0
- data/spec/requests/flows/refresh_token_spec.rb +282 -0
- data/spec/requests/flows/token_spec.rb +113 -0
- data/spec/requests/protected_resources_spec.rb +65 -0
- data/spec/requests/revoke_token_spec.rb +90 -0
- data/spec/spec_helper.rb +51 -0
- data/spec/support/helper.rb +11 -0
- metadata +125 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'rack/oauth2'
|
2
|
+
|
3
|
+
require 'simple_oauth2/configuration/class_accessors'
|
4
|
+
require 'simple_oauth2/configuration/constants'
|
5
|
+
require 'simple_oauth2/configuration'
|
6
|
+
require 'simple_oauth2/scopes'
|
7
|
+
require 'simple_oauth2/uniq_token'
|
8
|
+
require 'simple_oauth2/resource/bearer'
|
9
|
+
|
10
|
+
# Mixins
|
11
|
+
if defined?(NoBrainer::Document)
|
12
|
+
require 'simple_oauth2/mixins/nobrainer/access_token'
|
13
|
+
require 'simple_oauth2/mixins/nobrainer/access_grant'
|
14
|
+
require 'simple_oauth2/mixins/nobrainer/client'
|
15
|
+
end
|
16
|
+
|
17
|
+
# Authorization Grants aka Flows (Strategies)
|
18
|
+
require 'simple_oauth2/strategies/base'
|
19
|
+
require 'simple_oauth2/strategies/password'
|
20
|
+
require 'simple_oauth2/strategies/authorization_code'
|
21
|
+
require 'simple_oauth2/strategies/refresh_token'
|
22
|
+
require 'simple_oauth2/strategies/code'
|
23
|
+
require 'simple_oauth2/strategies/token'
|
24
|
+
require 'simple_oauth2/strategies/client_credentials'
|
25
|
+
|
26
|
+
# Generators
|
27
|
+
require 'simple_oauth2/generators/base'
|
28
|
+
require 'simple_oauth2/generators/token'
|
29
|
+
require 'simple_oauth2/generators/authorization'
|
30
|
+
|
31
|
+
# Helpers
|
32
|
+
require 'simple_oauth2/helpers'
|
33
|
+
|
34
|
+
# Responses
|
35
|
+
require 'simple_oauth2/responses'
|
36
|
+
|
37
|
+
# Simple namespace for the gem
|
38
|
+
module Simple
|
39
|
+
# Main Simple::OAuth2 module
|
40
|
+
module OAuth2
|
41
|
+
class << self
|
42
|
+
# Simple::OAuth2 configuration
|
43
|
+
#
|
44
|
+
# @return [Simple::OAuth2::Configuration] configuration object with default values
|
45
|
+
#
|
46
|
+
def config
|
47
|
+
@config ||= Simple::OAuth2::Configuration.new
|
48
|
+
end
|
49
|
+
|
50
|
+
# Configures Simple::OAuth2.
|
51
|
+
# Yields Simple::OAuth2::Configuration instance to the block
|
52
|
+
def configure
|
53
|
+
yield config if block_given?
|
54
|
+
end
|
55
|
+
|
56
|
+
# Simple::OAuth2 default middleware
|
57
|
+
def middleware
|
58
|
+
Simple::OAuth2::Resource::Bearer
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/logo.png
ADDED
Binary file
|
@@ -0,0 +1,22 @@
|
|
1
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
2
|
+
|
3
|
+
require 'simple_oauth2/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'simple_oauth2'
|
7
|
+
s.version = Simple::OAuth2.gem_version
|
8
|
+
s.date = '2017-01-03'
|
9
|
+
s.summary = 'OAuth2 authorization'
|
10
|
+
s.description = 'A flexible OAuth2 server authorization'
|
11
|
+
s.authors = ['Volodimir Partytskyi']
|
12
|
+
s.email = 'volodimir.partytskyi@gmail.com'
|
13
|
+
s.homepage = 'https://github.com/simple-oauth2/simple_oauth2'
|
14
|
+
s.license = 'MIT'
|
15
|
+
|
16
|
+
s.require_paths = %w(lib)
|
17
|
+
s.files = `git ls-files`.split($RS)
|
18
|
+
|
19
|
+
s.required_ruby_version = '>= 2.2.2'
|
20
|
+
|
21
|
+
s.add_runtime_dependency 'rack-oauth2', '~> 1.3.0', '>= 1.3.0'
|
22
|
+
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Simple::OAuth2::Configuration do
|
4
|
+
let(:config) { described_class.new }
|
5
|
+
|
6
|
+
class CustomClient
|
7
|
+
def self.authenticate(_key, _secret = nil)
|
8
|
+
'Test'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class CustomAccessToken
|
13
|
+
def self.create_for(_client, _resource_owner, _scopes = nil); end
|
14
|
+
|
15
|
+
def self.authenticate(_token, _type = nil)
|
16
|
+
'Test'
|
17
|
+
end
|
18
|
+
|
19
|
+
def client; end
|
20
|
+
|
21
|
+
def resource_owner; end
|
22
|
+
|
23
|
+
def expired?; end
|
24
|
+
|
25
|
+
def revoked?; end
|
26
|
+
|
27
|
+
def revoke!(_revoked_at = Time.now); end
|
28
|
+
|
29
|
+
def to_bearer_token; end
|
30
|
+
end
|
31
|
+
|
32
|
+
class CustomResourceOwner
|
33
|
+
def self.oauth_authenticate(_client, _username, _password)
|
34
|
+
'Test'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'default config' do
|
39
|
+
it { expect(config.access_token_lifetime).to eq(7200) }
|
40
|
+
it { expect(config.authorization_code_lifetime).to eq(1800) }
|
41
|
+
|
42
|
+
it { expect(config.realm).to eq(Simple::OAuth2::Configuration::DEFAULT_REALM) }
|
43
|
+
it { expect(config.allowed_grant_types).to eq(%w(password authorization_code refresh_token client_credentials)) }
|
44
|
+
|
45
|
+
it { expect(config.issue_refresh_token).to be_falsey }
|
46
|
+
it { expect(config.on_refresh).to eq(:nothing) }
|
47
|
+
|
48
|
+
it { expect(config.scopes_validator_class_name).to eq(Simple::OAuth2::Scopes.name) }
|
49
|
+
|
50
|
+
it { expect { config.resource_owner_authenticator.call('test') }.to raise_error(RuntimeError) }
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'custom config' do
|
54
|
+
class CustomScopesValidator
|
55
|
+
def self.valid?(_access_token, _scopes)
|
56
|
+
false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class CustomTokenGenerator
|
61
|
+
def self.generate(options = {})
|
62
|
+
if options[:custom]
|
63
|
+
'custom_token'
|
64
|
+
else
|
65
|
+
'default_token'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
before do
|
71
|
+
config.access_token_class_name = 'CustomAccessToken'
|
72
|
+
config.resource_owner_class_name = 'CustomResourceOwner'
|
73
|
+
config.client_class_name = 'CustomClient'
|
74
|
+
config.access_grant_class_name = 'Object'
|
75
|
+
config.scopes_validator_class_name = 'CustomScopesValidator'
|
76
|
+
end
|
77
|
+
|
78
|
+
after do
|
79
|
+
config.access_token_class_name = 'AccessToken'
|
80
|
+
config.resource_owner_class_name = 'ResourceOwner'
|
81
|
+
config.client_class_name = 'Client'
|
82
|
+
config.access_grant_class_name = 'AccessGrant'
|
83
|
+
config.scopes_validator_class_name = 'ScopesValidator'
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'works with custom token generator' do
|
87
|
+
before do
|
88
|
+
Simple::OAuth2.configure do |c|
|
89
|
+
c.token_generator_class_name = 'CustomTokenGenerator'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
after do
|
94
|
+
Simple::OAuth2.configure do |c|
|
95
|
+
c.token_generator_class_name = Simple::OAuth2::UniqToken.name
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
it { expect(Simple::OAuth2.config.token_generator.generate).to eq('default_token') }
|
100
|
+
it { expect(Simple::OAuth2.config.token_generator.generate(custom: true)).to eq('custom_token') }
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'invokes custom scopes validator' do
|
104
|
+
it { expect(config.scopes_validator.valid?(nil, nil)).to be_falsey }
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'works with custom Access Token class' do
|
108
|
+
it { expect(config.access_token_class.authenticate('')).to eq('Test') }
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'works with custom Client class' do
|
112
|
+
it { expect(config.client_class.authenticate('')).to eq('Test') }
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'works with custom Resource Owner class' do
|
116
|
+
it { expect(config.resource_owner_class.oauth_authenticate('', '', '')).to eq('Test') }
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'works with custom token authenticator' do
|
120
|
+
let(:request) { AccessToken.create }
|
121
|
+
|
122
|
+
before do
|
123
|
+
Simple::OAuth2.configure do |c|
|
124
|
+
c.token_authenticator do
|
125
|
+
raise ArgumentError, 'Test'
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
after do
|
131
|
+
Simple::OAuth2.configure do |c|
|
132
|
+
c.token_authenticator = config.default_token_authenticator
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it { expect { config.token_authenticator.call }.to raise_error(ArgumentError) }
|
137
|
+
end
|
138
|
+
|
139
|
+
context 'works with custom on_refresh callback' do
|
140
|
+
let(:token) { AccessToken.create }
|
141
|
+
|
142
|
+
before do
|
143
|
+
Simple::OAuth2.configure do |c|
|
144
|
+
c.on_refresh do |access_token|
|
145
|
+
access_token.update(scopes: 'test')
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
after(:all) do
|
151
|
+
Simple::OAuth2.configure do |c|
|
152
|
+
c.on_refresh = :nothing
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
it do
|
157
|
+
expect { Simple::OAuth2::Strategies::RefreshToken.send(:run_callback_on_refresh_token, token) }
|
158
|
+
.to change { token.scopes }.to('test')
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'raises an error with invalid on_refresh callback' do
|
163
|
+
before do
|
164
|
+
Simple::OAuth2.configure do |c|
|
165
|
+
c.on_refresh = 'invalid'
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
after(:all) do
|
170
|
+
Simple::OAuth2.configure do |c|
|
171
|
+
c.on_refresh = :nothing
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
it do
|
176
|
+
expect { Simple::OAuth2::Strategies::RefreshToken.send(:run_callback_on_refresh_token, nil) }
|
177
|
+
.to raise_error(ArgumentError)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Simlpe::OAuth2 Version' do
|
4
|
+
context 'has a version string' do
|
5
|
+
it { expect(Simple::OAuth2::VERSION::STRING).to be_present }
|
6
|
+
end
|
7
|
+
|
8
|
+
context 'returns version as an instance of Gem::Version' do
|
9
|
+
it { expect(Simple::OAuth2.gem_version).to be_an_instance_of(Gem::Version) }
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Twitter
|
2
|
+
module Endpoints
|
3
|
+
module Authorization
|
4
|
+
def call(env)
|
5
|
+
response = Simple::OAuth2::Generators::Authorization.generate_for(env)
|
6
|
+
|
7
|
+
status = response.status
|
8
|
+
headers = response.headers
|
9
|
+
body = JSON.generate(response.body)
|
10
|
+
|
11
|
+
[status, headers, [body]]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Twitter
|
2
|
+
module Endpoints
|
3
|
+
module CustomAuthorization
|
4
|
+
def request
|
5
|
+
@request
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
@request = Rack::Request.new(env)
|
10
|
+
|
11
|
+
response = Simple::OAuth2::Generators::Authorization.generate_for(env, &:unsupported_response_type!)
|
12
|
+
|
13
|
+
status = response.status
|
14
|
+
headers = response.headers
|
15
|
+
body = JSON.generate(response.body)
|
16
|
+
|
17
|
+
[status, headers, [body]]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Twitter
|
2
|
+
module Endpoints
|
3
|
+
module CustomToken
|
4
|
+
def request
|
5
|
+
@request
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
@request = Rack::Request.new(env)
|
10
|
+
|
11
|
+
response = Simple::OAuth2::Generators::Token.generate_for(env, &:unsupported_grant_type!)
|
12
|
+
|
13
|
+
status = response.status
|
14
|
+
headers = response.headers
|
15
|
+
body = JSON.generate(response.body)
|
16
|
+
|
17
|
+
[status, headers, [body]]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Twitter
|
2
|
+
module Endpoints
|
3
|
+
module StatusSingleScope
|
4
|
+
def request
|
5
|
+
@request
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
@request = Rack::Request.new(env)
|
10
|
+
@current_resource_owner = nil # Refresh cache instance variable
|
11
|
+
@current_access_token = nil # Refresh cache instance variable
|
12
|
+
|
13
|
+
access_token_required! :read
|
14
|
+
body = JSON.dump(value: 'Access read', current_user_name: current_resource_owner.username)
|
15
|
+
[200, { 'content-type' => 'application/json' }, [body]]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module StatusMultipleScopes
|
20
|
+
def request
|
21
|
+
@request
|
22
|
+
end
|
23
|
+
|
24
|
+
def call(env)
|
25
|
+
@request = Rack::Request.new(env)
|
26
|
+
@current_resource_owner = nil # Refresh cache instance variable
|
27
|
+
@current_access_token = nil # Refresh cache instance variable
|
28
|
+
|
29
|
+
access_token_required! :read, :write
|
30
|
+
body = JSON.dump(value: 'Access read, write', current_user_name: current_resource_owner.username)
|
31
|
+
[200, { 'content-type' => 'application/json' }, [body]]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
module Status
|
36
|
+
def request
|
37
|
+
@request
|
38
|
+
end
|
39
|
+
|
40
|
+
def call(env)
|
41
|
+
@request = Rack::Request.new(env)
|
42
|
+
@current_resource_owner = nil # Refresh cache instance variable
|
43
|
+
@current_access_token = nil # Refresh cache instance variable
|
44
|
+
|
45
|
+
access_token_required!
|
46
|
+
body = JSON.dump(value: 'Access', current_user_name: current_resource_owner.username)
|
47
|
+
[200, { 'content-type' => 'application/json' }, [body]]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Twitter
|
2
|
+
module Endpoints
|
3
|
+
module Token
|
4
|
+
def call(env)
|
5
|
+
response = Simple::OAuth2::Generators::Token.generate_for(env)
|
6
|
+
|
7
|
+
status = response.status
|
8
|
+
headers = response.headers
|
9
|
+
body = JSON.generate(response.body)
|
10
|
+
|
11
|
+
[status, headers, [body]]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module RevokeToken
|
16
|
+
def call(env)
|
17
|
+
params = Rack::Request.new(env).params
|
18
|
+
Simple::OAuth2::Generators::Token.revoke(params['token'], env)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
NoBrainer::Document::PrimaryKey.__send__(:remove_const, :DEFAULT_PK_NAME)
|
2
|
+
NoBrainer::Document::PrimaryKey.__send__(:const_set, :DEFAULT_PK_NAME, :_id_)
|
3
|
+
|
4
|
+
NoBrainer.configure do |config|
|
5
|
+
config.reset!
|
6
|
+
config.rethinkdb_url = "rethinkdb://localhost/#{"#{ENV['ORM']}_#{ENV['RAILS_ENV']}"}"
|
7
|
+
config.environment = ENV['RAILS_ENV']
|
8
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class User
|
2
|
+
include NoBrainer::Document
|
3
|
+
|
4
|
+
field :username, type: String, index: true
|
5
|
+
field :encrypted_password, type: String
|
6
|
+
|
7
|
+
def self.oauth_authenticate(_client, username, password)
|
8
|
+
user = where(username: username.to_s).first
|
9
|
+
user if user && user.encrypted_password == password
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require File.expand_path('../../../../../../lib/simple_oauth2', __FILE__)
|
2
|
+
|
3
|
+
require_relative 'models/access_token'
|
4
|
+
require_relative 'models/access_grant'
|
5
|
+
require_relative 'models/client'
|
6
|
+
require_relative 'models/user'
|
7
|
+
|
8
|
+
require_relative '../../../endpoints/authorization'
|
9
|
+
require_relative '../../../endpoints/custom_authorization'
|
10
|
+
require_relative '../../../endpoints/token'
|
11
|
+
require_relative '../../../endpoints/custom_token'
|
12
|
+
require_relative '../../../endpoints/status'
|
13
|
+
|
14
|
+
load File.expand_path('../config/db.rb', __FILE__)
|
15
|
+
load File.expand_path('../../../../simple_oauth2_config.rb', __FILE__)
|
16
|
+
|
17
|
+
include Simple::OAuth2::Helpers
|
18
|
+
|
19
|
+
module Twitter
|
20
|
+
class Token
|
21
|
+
extend Twitter::Endpoints::Token
|
22
|
+
end
|
23
|
+
|
24
|
+
class RevokeToken
|
25
|
+
extend Twitter::Endpoints::RevokeToken
|
26
|
+
end
|
27
|
+
|
28
|
+
class CustomToken
|
29
|
+
extend Twitter::Endpoints::CustomToken
|
30
|
+
end
|
31
|
+
|
32
|
+
class Authorization
|
33
|
+
extend Twitter::Endpoints::Authorization
|
34
|
+
end
|
35
|
+
|
36
|
+
class CustomAuthorization
|
37
|
+
extend Twitter::Endpoints::CustomAuthorization
|
38
|
+
end
|
39
|
+
|
40
|
+
class Status
|
41
|
+
extend Twitter::Endpoints::Status
|
42
|
+
end
|
43
|
+
|
44
|
+
class StatusSingleScope
|
45
|
+
extend Twitter::Endpoints::StatusSingleScope
|
46
|
+
end
|
47
|
+
|
48
|
+
class StatusMultipleScopes
|
49
|
+
extend Twitter::Endpoints::StatusMultipleScopes
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'app/twitter'
|
4
|
+
|
5
|
+
use Simple::OAuth2.middleware
|
6
|
+
|
7
|
+
map '/oauth/token' do
|
8
|
+
run Twitter::Token
|
9
|
+
end
|
10
|
+
|
11
|
+
map '/oauth/revoke_token' do
|
12
|
+
run Twitter::RevokeToken
|
13
|
+
end
|
14
|
+
|
15
|
+
map '/oauth/authorization' do
|
16
|
+
run Twitter::Authorization
|
17
|
+
end
|
18
|
+
|
19
|
+
map '/oauth/custom_token' do
|
20
|
+
run Twitter::CustomToken
|
21
|
+
end
|
22
|
+
|
23
|
+
map '/oauth/custom_authorization' do
|
24
|
+
run Twitter::CustomAuthorization
|
25
|
+
end
|
26
|
+
|
27
|
+
map '/api/v1/status' do
|
28
|
+
run Twitter::Status
|
29
|
+
end
|
30
|
+
|
31
|
+
map '/api/v1/status/single_scope' do
|
32
|
+
run Twitter::StatusSingleScope
|
33
|
+
end
|
34
|
+
|
35
|
+
map '/api/v1/status/multiple_scopes' do
|
36
|
+
run Twitter::StatusMultipleScopes
|
37
|
+
end
|