oauth_service 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +7 -0
- data/Rakefile +34 -0
- data/app/controllers/concerns/oauth_service/google.rb +12 -0
- data/app/controllers/concerns/oauth_service/mailru.rb +29 -0
- data/app/controllers/concerns/oauth_service/yandex.rb +19 -0
- data/app/controllers/oauth_service/access_controller.rb +34 -0
- data/app/controllers/oauth_service/login_controller.rb +90 -0
- data/app/models/oauth_service/url.rb +9 -0
- data/app/models/oauth_service/user.rb +5 -0
- data/app/models/oauth_service/user_group.rb +5 -0
- data/app/models/oauth_service/users_group.rb +6 -0
- data/app/models/oauth_service/users_url.rb +6 -0
- data/config/routes.rb +6 -0
- data/lib/generators/oauth_service/controllers_generator.rb +15 -0
- data/lib/generators/oauth_service/install_generator.rb +15 -0
- data/lib/generators/oauth_service/migrations_generator.rb +20 -0
- data/lib/generators/oauth_service/models_generator.rb +17 -0
- data/lib/generators/templates/controllers/login_controller.rb +3 -0
- data/lib/generators/templates/migrations/create_tables.rb +45 -0
- data/lib/generators/templates/models/url.rb +2 -0
- data/lib/generators/templates/models/user.rb +3 -0
- data/lib/generators/templates/models/user_group.rb +3 -0
- data/lib/generators/templates/models/users_group.rb +3 -0
- data/lib/generators/templates/models/users_url.rb +2 -0
- data/lib/generators/templates/oauth_service.rb +12 -0
- data/lib/oauth_service/engine.rb +4 -0
- data/lib/oauth_service/provider.rb +85 -0
- data/lib/oauth_service/version.rb +3 -0
- data/lib/oauth_service.rb +29 -0
- data/lib/tasks/oauth_service_tasks.rake +4 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/controllers/d_controller.rb +5 -0
- data/test/dummy/app/controllers/login_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/url.rb +2 -0
- data/test/dummy/app/models/user.rb +3 -0
- data/test/dummy/app/models/user_group.rb +3 -0
- data/test/dummy/app/models/users_group.rb +3 -0
- data/test/dummy/app/models/users_url.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/login/index.html.erb +15 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/oauth_service.rb +12 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +58 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20160514163909_create_tables.rb +45 -0
- data/test/dummy/db/schema.rb +45 -0
- data/test/dummy/log/development.log +17802 -0
- data/test/dummy/log/test.log +860 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/test/fixtures/urls.yml +17 -0
- data/test/dummy/test/fixtures/user_groups.yml +7 -0
- data/test/dummy/test/fixtures/users.yml +9 -0
- data/test/dummy/test/fixtures/users_groups.yml +9 -0
- data/test/dummy/test/fixtures/users_urls.yml +9 -0
- data/test/dummy/test/models/url_test.rb +7 -0
- data/test/dummy/test/models/user_group_test.rb +7 -0
- data/test/dummy/test/models/user_test.rb +7 -0
- data/test/dummy/test/models/users_group_test.rb +7 -0
- data/test/dummy/test/models/users_url_test.rb +7 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/5L/5Lly_CA8DZvPhQV2jDQx-Y6P_y3Ygra9t5jfSlGhHDA.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/6I/6Iapn2T9iTksiIpNjV38wlfVmi1jq4PD1Xh1Dr0fR0o.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/CN/CN681ktqxLiK3U4MteA6Q4ZunlBxEgm2YFdmwxg3I6E.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ch/Ch2bQFHkYziI9Erdkuj8uoPJyw0W2aA5prtYAqlccww.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/DS/DSOLSc6A5RVSmvM415eEWAWG_AgOvZcLZOXQjsXyWQA.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Fr/FrVwswdDNGIkD24DY-aVGVj_ODmW3_o_Ji5khIzOlMI.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/JY/JYpZExAhxpesd9z2s7dJupiDc-rDf6RBnmWH-HYpr2A.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/J_/J_9ERjsyvsou7I7CNLORkwcBYyxCSdQRj9el7fbYNx4.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/K9/K9ZheMi0hi4DNLzmDMRnv9A_lOVz33kNImc16Now42o.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/LH/LHgjtAV8kdldaJ_dX0RCznzjmWYRuLdhU29fZCJ0VmU.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Nn/NnUCa7jNYx9HCmEB7E7WPWT00DwaM4IYICy1Ju1jjcs.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/OI/OI6uxGcnsKavdWTtwDAasU3wPx8QXhzBgV0X2n1KjMQ.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/Uo/Uon_Y1HqDVimN2TgfScHxbXPjDSsOsj6d7l8v4pJEO0.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/b-/b-1gw2MCeaTZEWFQ_udDtgx4hJmooIz9uDVlHE97S2g.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/bs/bsek6r8m5C0VziFPGuHOVymYEpIXo5gZyfU-8nPj01M.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/gZ/gZp3uXMHuYQC4hzCr7bQfetKNdJAtbQmg3so2KpW1Dw.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/hZ/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/kz/kzdSvu57G4i6eTuarsZCAfbhbICnkRa0Xhi0b9ua6qk.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/lz/lz4_WSikXa5YohqgYmqCvVmW_r_ncbvtgDX7bJoO03s.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/pE/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +2 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/qS/qSORh00SA5qx5xcvNgMx-S-T737dJS6smxZEhRaf0J4.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/qd/qdZCi8acwxpvAQAC8sNXRjkz73Pdy7yQpG7_rNCxcYs.cache +0 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/rC/rCO5-bHVJ6Y_GsPBmOPUL23pfjvc2Gw2zt_ODmZsygw.cache +1 -0
- data/test/dummy/tmp/cache/assets/sprockets/v3.0/uV/uVnTx3UxyufXVkCnR8AW30pR5GiIUTCMcOMEPWt38dY.cache +1 -0
- data/test/oauth_service_provider_test.rb +8 -0
- data/test/oauth_service_test.rb +7 -0
- data/test/test_helper.rb +19 -0
- metadata +273 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: fc4e4f436f6b04ef9ba3061db91a2d1c9e49649c
|
|
4
|
+
data.tar.gz: 39e7c45adb3f4a851ee20d40dfad135eb4e97046
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: d119e5c4b4dd7fac49b8d020ef06bfa200212e35c72d0590093dc15b74f76f3eaa9eb3eeb933bb8c8fa4aa808f45fa739de87365f55d4352b646e1e1324cb671
|
|
7
|
+
data.tar.gz: 8e167caf502e999ae856fe346a02bf93fddbb3babfd277876ba086b8e6a67bcbdbcc75933c04e1155bbff2e000c786a7ff301dda7c6b00a188abc64a50d07a9a
|
data/MIT-LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright 2016 DCrow
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
data/Rakefile
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
begin
|
|
2
|
+
require 'bundler/setup'
|
|
3
|
+
rescue LoadError
|
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
require 'rdoc/task'
|
|
8
|
+
|
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
11
|
+
rdoc.title = 'OauthService'
|
|
12
|
+
rdoc.options << '--line-numbers'
|
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
Bundler::GemHelper.install_tasks
|
|
23
|
+
|
|
24
|
+
require 'rake/testtask'
|
|
25
|
+
|
|
26
|
+
Rake::TestTask.new(:test) do |t|
|
|
27
|
+
t.libs << 'lib'
|
|
28
|
+
t.libs << 'test'
|
|
29
|
+
t.pattern = 'test/**/*_test.rb'
|
|
30
|
+
t.verbose = false
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
task default: :test
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module OauthService
|
|
2
|
+
class MailRu < Provider
|
|
3
|
+
def initialize(name, downcase_name, auth_url, client_id, client_secret,
|
|
4
|
+
info_url, scopes, token_url)
|
|
5
|
+
super(name, downcase_name, auth_url, client_id, client_secret,
|
|
6
|
+
info_url, scopes, token_url)
|
|
7
|
+
@scopes = nil
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def get_user_info(info)
|
|
11
|
+
info.first
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def get_info_headers(options = {})
|
|
15
|
+
nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def get_info_params(options = {})
|
|
19
|
+
query_params = {
|
|
20
|
+
'app_id' => client_id,
|
|
21
|
+
'method' => 'users.getInfo',
|
|
22
|
+
'secure' => 1,
|
|
23
|
+
'session_key' => options[:access_token]
|
|
24
|
+
}
|
|
25
|
+
query_params['sig'] = Digest::MD5.hexdigest(query_params.collect { |v| v.join('=') }.join + client_secret)
|
|
26
|
+
query_params
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module OauthService
|
|
2
|
+
class Yandex < Provider
|
|
3
|
+
def get_user_info(info)
|
|
4
|
+
{
|
|
5
|
+
:email => info[:default_email],
|
|
6
|
+
:id => info[:id],
|
|
7
|
+
:name => info[:display_name]
|
|
8
|
+
}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def get_info_headers(options = {})
|
|
12
|
+
{ 'Authorization' => "OAuth #{options[:access_token]}" }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def get_info_params(options = {})
|
|
16
|
+
{}
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module OauthService
|
|
2
|
+
class AccessController < OauthService.parent_controller.constantize
|
|
3
|
+
before_filter :check_access
|
|
4
|
+
|
|
5
|
+
def get_user_id
|
|
6
|
+
if (api_code = request.headers["HTTP_API_CODE"]) && api_code!=""
|
|
7
|
+
user = ::User.find_by(api_code: api_code)
|
|
8
|
+
else
|
|
9
|
+
user = ::User.find_by(name: "guest")
|
|
10
|
+
end
|
|
11
|
+
user.id
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def check_access
|
|
15
|
+
check_status = false
|
|
16
|
+
path = request.path
|
|
17
|
+
http_method = request.method.to_s
|
|
18
|
+
user_urls = ::Url.by_user get_user_id
|
|
19
|
+
|
|
20
|
+
check_status = user_urls.any? do |user_url|
|
|
21
|
+
path[Regexp.new(user_url.url_pattern)]==path &&
|
|
22
|
+
(user_url.http_method.nil? || http_method==user_url.http_method)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
unless check_status
|
|
26
|
+
if request.headers["HTTP_API_CODE"]
|
|
27
|
+
render :json => {:success => false, :error => "Not authorized"}, :status => 401
|
|
28
|
+
else
|
|
29
|
+
render :json => {:success => false, :error => "Permission denied"}, :status => 403
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
require "oauth_service"
|
|
2
|
+
|
|
3
|
+
module OauthService
|
|
4
|
+
class LoginController < AccessController
|
|
5
|
+
def oauth_callback
|
|
6
|
+
user_info = get_user_info(params[:provider_name], request.url, params[:code])
|
|
7
|
+
|
|
8
|
+
if user_info
|
|
9
|
+
user = ::User.find_by(name: user_info[:email])
|
|
10
|
+
api_code = generate_api_code
|
|
11
|
+
success = user.blank?
|
|
12
|
+
|
|
13
|
+
unless success
|
|
14
|
+
user.update_attributes(:api_code => api_code)
|
|
15
|
+
render :json => {:success => true, :api_code => api_code}, :status => 200
|
|
16
|
+
else
|
|
17
|
+
render :json => {:success => false, :error=> "No such user exists"}, :status => 404
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def logout
|
|
23
|
+
user = ::User.find_by(api_code: api_code)
|
|
24
|
+
success = user.blank?
|
|
25
|
+
unless success
|
|
26
|
+
user.update_attributes(:api_code => nil)
|
|
27
|
+
render :json => {:success => true}, :status => 400
|
|
28
|
+
else
|
|
29
|
+
render :json => {:success => false, :error=> "No such user exists"}, :status => 400
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
def generate_api_code
|
|
35
|
+
SecureRandom.uuid
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def get_user_info(provider_name, redirect_uri, code)
|
|
39
|
+
provider = OauthService::Provider::get_provider_by_name(provider_name)
|
|
40
|
+
token_uri = URI.parse(provider.token_url)
|
|
41
|
+
http_token = Net::HTTP.new(token_uri.host, token_uri.port)
|
|
42
|
+
http_token.use_ssl = true if token_uri.scheme == "https"
|
|
43
|
+
|
|
44
|
+
http_token.start do |http_token_request|
|
|
45
|
+
res = http_token_request.send_request("POST",
|
|
46
|
+
token_uri.request_uri,
|
|
47
|
+
URI.encode_www_form(provider.get_token_params(original_url: redirect_uri, code: code)),
|
|
48
|
+
{ 'Content-Type' => "application/x-www-form-urlencoded" })
|
|
49
|
+
|
|
50
|
+
res_body = ActiveSupport::JSON.decode(res.body).symbolize_keys
|
|
51
|
+
|
|
52
|
+
if res.code!='200'
|
|
53
|
+
render :json => {
|
|
54
|
+
:success => false,
|
|
55
|
+
:error => res_body[:error],
|
|
56
|
+
:error_description => res_body[:error_description]
|
|
57
|
+
},
|
|
58
|
+
:status => res.code
|
|
59
|
+
return false
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
info_uri = URI.parse(provider.info_url + "?" +
|
|
63
|
+
URI.encode_www_form(provider.get_info_params(access_token: res_body[:access_token])))
|
|
64
|
+
http_info = Net::HTTP.new(info_uri.host, info_uri.port)
|
|
65
|
+
http_info.use_ssl = true if info_uri.scheme == "https"
|
|
66
|
+
|
|
67
|
+
http_info.start do |http_info_request|
|
|
68
|
+
res = http_info_request.send_request("GET",
|
|
69
|
+
info_uri.request_uri,
|
|
70
|
+
nil,
|
|
71
|
+
provider.get_info_headers(access_token: res_body[:access_token]))
|
|
72
|
+
|
|
73
|
+
res_body = ActiveSupport::JSON.decode(res.body).symbolize_keys
|
|
74
|
+
|
|
75
|
+
if res.code!='200'
|
|
76
|
+
render :json => {
|
|
77
|
+
:success => false,
|
|
78
|
+
:error => res_body[:error],
|
|
79
|
+
:error_description => res_body[:error_description]
|
|
80
|
+
},
|
|
81
|
+
:status => res.code
|
|
82
|
+
return false
|
|
83
|
+
end
|
|
84
|
+
provider.get_user_info(res_body)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
require "oauth_service"
|
|
2
|
+
|
|
3
|
+
Rails.application.routes.draw do
|
|
4
|
+
get "#{OauthService.redirect_uri}/:provider_name", to: "#{OauthService.login_controller[0..-11].downcase}#oauth_callback"
|
|
5
|
+
get "#{OauthService.redirect_uri}/logout", to: "#{OauthService.login_controller[0..-11].downcase}#logout"
|
|
6
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require 'rails/generators/base'
|
|
2
|
+
|
|
3
|
+
module OauthService
|
|
4
|
+
module Generators
|
|
5
|
+
class ControllersGenerator < Rails::Generators::Base
|
|
6
|
+
source_root File.expand_path("../../templates/controllers", __FILE__)
|
|
7
|
+
|
|
8
|
+
desc "Create inherited LoginController in your app/controllers folder."
|
|
9
|
+
|
|
10
|
+
def create_controllers
|
|
11
|
+
template "login_controller.rb", "app/controllers/login_controller.rb"
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require "rails/generators/base"
|
|
2
|
+
|
|
3
|
+
module OauthService
|
|
4
|
+
module Generators
|
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
|
6
|
+
source_root File.expand_path("../../templates", __FILE__)
|
|
7
|
+
|
|
8
|
+
desc "Creates a OauthService initializer."
|
|
9
|
+
|
|
10
|
+
def copy_initializer
|
|
11
|
+
template "oauth_service.rb", "config/initializers/oauth_service.rb"
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'rails/generators/migration'
|
|
2
|
+
|
|
3
|
+
module OauthService
|
|
4
|
+
module Generators
|
|
5
|
+
class MigrationsGenerator < Rails::Generators::Base
|
|
6
|
+
include Rails::Generators::Migration
|
|
7
|
+
source_root File.expand_path("../../templates/migrations", __FILE__)
|
|
8
|
+
|
|
9
|
+
desc "Create table migration in your db/migrate folder."
|
|
10
|
+
|
|
11
|
+
def create_migrations
|
|
12
|
+
migration_template "create_tables.rb", "db/migrate/create_tables.rb"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.next_migration_number(path)
|
|
16
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'rails/generators/base'
|
|
2
|
+
|
|
3
|
+
module OauthService
|
|
4
|
+
module Generators
|
|
5
|
+
class ModelsGenerator < Rails::Generators::Base
|
|
6
|
+
source_root File.expand_path("../../templates/models", __FILE__)
|
|
7
|
+
|
|
8
|
+
desc "Create inherited Models in your app/models folder."
|
|
9
|
+
|
|
10
|
+
def create_models
|
|
11
|
+
MODELS.each do |model|
|
|
12
|
+
template "#{model}.rb", "app/models/#{model}.rb"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
class CreateTables < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
|
|
4
|
+
create_table :users do |t|
|
|
5
|
+
t.string :name, nil: false, index: true
|
|
6
|
+
t.string :api_code
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
create_table :urls do |t|
|
|
10
|
+
t.string :url_pattern
|
|
11
|
+
t.string :name
|
|
12
|
+
t.string :http_method
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
create_table :user_groups do |t|
|
|
16
|
+
t.string :name, nil: false, index: true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
create_table :users_groups do |t|
|
|
20
|
+
t.integer :user_group_id
|
|
21
|
+
t.integer :user_id
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
create_table :users_urls do |t|
|
|
25
|
+
t.integer :users_group_id
|
|
26
|
+
t.integer :url_id
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
User.create :name => "guest", :id => 1
|
|
30
|
+
Url.create :url_pattern => "^/login", :name => "Login page", :http_method => "GET", :id => 1
|
|
31
|
+
Url.create :url_pattern => "^/oauth/.*", :name => "AuthCallback page", :http_method => "GET", :id => 2
|
|
32
|
+
UserGroup.create :id => 1, :name => "Guest"
|
|
33
|
+
UsersGroup.create :id => 1, :user_id => 1, :user_group_id => 1
|
|
34
|
+
UsersUrl.create :id => 1, :url_id => 1, :users_group_id => 1
|
|
35
|
+
UsersUrl.create :id => 2, :url_id => 2, :users_group_id => 1
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.down
|
|
39
|
+
drop_table :users_urls
|
|
40
|
+
drop_table :users_groups
|
|
41
|
+
drop_table :user_groups
|
|
42
|
+
drop_table :users
|
|
43
|
+
drop_table :urls
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
OauthService.setup do |config|
|
|
2
|
+
# The parent controller all OauthService controllers inherits from.
|
|
3
|
+
# config.parent_controller = "ApplicationController"
|
|
4
|
+
|
|
5
|
+
# The controller name where auth callback is redirected.
|
|
6
|
+
# Has to extend OauthService::LoginController.
|
|
7
|
+
# Change if default login controller is not LoginController.
|
|
8
|
+
# config.login_controller = "LoginController"
|
|
9
|
+
|
|
10
|
+
# The relative route where auth service callback is redirected.
|
|
11
|
+
# config.redirect_uri = "/oauth/"
|
|
12
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
module OauthService
|
|
2
|
+
class Provider
|
|
3
|
+
AVAILABLE_PROVIDERS = ['YANDEX', 'GOOGLE', 'MAIL_RU']
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
attr_reader :name, :downcase_name, :auth_url, :client_id, :client_secret,
|
|
7
|
+
:info_url, :scopes, :token_url
|
|
8
|
+
|
|
9
|
+
def initialize(name, downcase_name, auth_url, client_id, client_secret,
|
|
10
|
+
info_url, scopes, token_url)
|
|
11
|
+
@name = name
|
|
12
|
+
@downcase_name = downcase_name
|
|
13
|
+
@auth_url = auth_url
|
|
14
|
+
@client_id = client_id
|
|
15
|
+
@client_secret = client_secret
|
|
16
|
+
@info_url = info_url
|
|
17
|
+
@scopes = scopes
|
|
18
|
+
@token_url = token_url
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def get_redirect_uri(request_url)
|
|
22
|
+
redirect_uri = OauthService.redirect_uri
|
|
23
|
+
|
|
24
|
+
if redirect_uri[0..3]=="http"
|
|
25
|
+
redirect_uri + downcase_name
|
|
26
|
+
else
|
|
27
|
+
uri = URI.parse(request_url)
|
|
28
|
+
uri.path = redirect_uri + downcase_name
|
|
29
|
+
uri.query = nil
|
|
30
|
+
|
|
31
|
+
return uri.to_s
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def get_token_params(options = {})
|
|
36
|
+
{
|
|
37
|
+
'client_id' => client_id,
|
|
38
|
+
'client_secret' => client_secret,
|
|
39
|
+
'redirect_uri' => get_redirect_uri(options[:original_url]),
|
|
40
|
+
'grant_type' => 'authorization_code',
|
|
41
|
+
'code' => options[:code]
|
|
42
|
+
}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def get_user_info(info)
|
|
46
|
+
info
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def get_info_headers(options = {})
|
|
50
|
+
raise "Headers for token request method is undefined"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def get_info_params(options = {})
|
|
54
|
+
raise "Paramaters for information request method is undefined"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.providers_data
|
|
58
|
+
@@providers_data ||= AVAILABLE_PROVIDERS.collect do |provider|
|
|
59
|
+
("OauthService::Provider::#{provider.downcase.camelize}").constantize.new(
|
|
60
|
+
provider,
|
|
61
|
+
provider.downcase,
|
|
62
|
+
ENV["#{provider}_AUTH_URL"],
|
|
63
|
+
ENV["#{provider}_CLIENT_ID"],
|
|
64
|
+
ENV["#{provider}_CLIENT_SECRET"],
|
|
65
|
+
ENV["#{provider}_INFO_URL"],
|
|
66
|
+
ENV["#{provider}_SCOPES"],
|
|
67
|
+
ENV["#{provider}_TOKEN_URL"]
|
|
68
|
+
) if ENV["#{provider}_AUTH_URL"] &&
|
|
69
|
+
ENV["#{provider}_CLIENT_ID"] &&
|
|
70
|
+
ENV["#{provider}_CLIENT_SECRET"] &&
|
|
71
|
+
ENV["#{provider}_INFO_URL"] &&
|
|
72
|
+
ENV["#{provider}_SCOPES"] &&
|
|
73
|
+
ENV["#{provider}_TOKEN_URL"]
|
|
74
|
+
end.compact
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.get_provider_by_name(name)
|
|
78
|
+
res = providers_data.select do |provider|
|
|
79
|
+
provider.downcase_name == name.downcase
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
res ? res.first : nil
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require "oauth_service/provider"
|
|
2
|
+
require "oauth_service/engine"
|
|
3
|
+
require "securerandom"
|
|
4
|
+
require "rails"
|
|
5
|
+
|
|
6
|
+
module OauthService
|
|
7
|
+
MODELS = ['url', 'users_url', 'user', 'user_group', 'users_group']
|
|
8
|
+
|
|
9
|
+
# The parent controller all OauthService controllers inherits from.
|
|
10
|
+
# Defaults to "ApplicationController".
|
|
11
|
+
mattr_accessor :parent_controller
|
|
12
|
+
@@parent_controller = "ApplicationController"
|
|
13
|
+
|
|
14
|
+
# The relative route where auth service callback is redirected.
|
|
15
|
+
# Defaults to "/oauth/".
|
|
16
|
+
mattr_accessor :redirect_uri
|
|
17
|
+
@@redirect_uri = "/oauth/"
|
|
18
|
+
|
|
19
|
+
# Name of the controller which inherits from OauthService::LoginController
|
|
20
|
+
# Defaults to "LoginController".
|
|
21
|
+
mattr_accessor :login_controller
|
|
22
|
+
@@login_controller = "LoginController"
|
|
23
|
+
|
|
24
|
+
# Default way to set up OauthService. Run rails generate oauth_service:install to create
|
|
25
|
+
# a fresh initializer with all configuration values.
|
|
26
|
+
def self.setup
|
|
27
|
+
yield self
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
== README
|
|
2
|
+
|
|
3
|
+
This README would normally document whatever steps are necessary to get the
|
|
4
|
+
application up and running.
|
|
5
|
+
|
|
6
|
+
Things you may want to cover:
|
|
7
|
+
|
|
8
|
+
* Ruby version
|
|
9
|
+
|
|
10
|
+
* System dependencies
|
|
11
|
+
|
|
12
|
+
* Configuration
|
|
13
|
+
|
|
14
|
+
* Database creation
|
|
15
|
+
|
|
16
|
+
* Database initialization
|
|
17
|
+
|
|
18
|
+
* How to run the test suite
|
|
19
|
+
|
|
20
|
+
* Services (job queues, cache servers, search engines, etc.)
|
|
21
|
+
|
|
22
|
+
* Deployment instructions
|
|
23
|
+
|
|
24
|
+
* ...
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
Please feel free to use a different markup language if you do not plan to run
|
|
28
|
+
<tt>rake doc:app</tt>.
|
data/test/dummy/Rakefile
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
|
2
|
+
// listed below.
|
|
3
|
+
//
|
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
|
6
|
+
//
|
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
|
8
|
+
// compiled file.
|
|
9
|
+
//
|
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
|
11
|
+
// about supported directives.
|
|
12
|
+
//
|
|
13
|
+
//= require_tree .
|