rails_sso 0.0.1 → 0.1.0
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 +4 -4
- data/README.md +19 -8
- data/Rakefile +0 -15
- data/app/controllers/rails_sso/sessions_controller.rb +2 -3
- data/app/services/rails_sso/fetch_user.rb +19 -0
- data/{lib → app/services}/rails_sso/update_user.rb +3 -3
- data/lib/rails_sso/access_token.rb +52 -0
- data/lib/rails_sso/helpers.rb +31 -17
- data/lib/rails_sso/version.rb +1 -1
- data/lib/rails_sso.rb +5 -2
- data/test/controllers/rails_sso/sessions_controller_test.rb +43 -0
- data/test/dummy/app/controllers/application_controller.rb +4 -0
- data/test/dummy/config/initializers/sso.rb +13 -0
- data/test/dummy/config/routes.rb +2 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/test.log +2017 -0
- data/test/services/rails_sso/fetch_user_test.rb +46 -0
- data/test/services/rails_sso/update_user_test.rb +79 -0
- data/test/test_helper.rb +1 -0
- metadata +75 -6
- data/lib/rails_sso/fetch_user.rb +0 -45
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RailsSso::FetchUserTest < ActiveSupport::TestCase
|
4
|
+
class AccessToken
|
5
|
+
def initialize(client)
|
6
|
+
@client = client
|
7
|
+
end
|
8
|
+
|
9
|
+
def get(path)
|
10
|
+
OAuth2::Response.new(@client.get(path))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@access_token = AccessToken.new(setup_access_token_client)
|
16
|
+
end
|
17
|
+
|
18
|
+
test "call should fetch user with access token and yield parsed data" do
|
19
|
+
called = false
|
20
|
+
|
21
|
+
RailsSso::FetchUser.new(@access_token).call do |data|
|
22
|
+
called = true
|
23
|
+
|
24
|
+
assert_equal data['name'], user_data['name']
|
25
|
+
assert_equal data['email'], user_data['email']
|
26
|
+
end
|
27
|
+
|
28
|
+
assert called, 'RailsSso::FetchUser#call should yield fetched data'
|
29
|
+
end
|
30
|
+
|
31
|
+
def setup_access_token_client
|
32
|
+
Faraday.new do |builder|
|
33
|
+
builder.adapter :test do |stub|
|
34
|
+
stub.get('/api/v1/me') { |env| [200, { 'Content-Type' => 'application/json' }, user_data] }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def user_data
|
40
|
+
{
|
41
|
+
'name' => 'Kowalski',
|
42
|
+
'email' => 'jan@kowalski.pl',
|
43
|
+
'key' => 'value'
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'anima'
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
class RailsSso::UpdateUserTest < ActiveSupport::TestCase
|
5
|
+
class User
|
6
|
+
include Anima.new('email', 'name')
|
7
|
+
|
8
|
+
attr_accessor :id
|
9
|
+
attr_writer :name, :email
|
10
|
+
end
|
11
|
+
|
12
|
+
class Repository
|
13
|
+
attr_reader :storage
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@storage = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def find_by_sso_id(id)
|
20
|
+
storage[id]
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_with_sso_id(id, data)
|
24
|
+
@storage[id] = User.new(data).tap do |user|
|
25
|
+
user.id = id
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def update(user, params)
|
30
|
+
params.each do |k, v|
|
31
|
+
user.send("#{k}=", v)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def setup
|
37
|
+
@repository = Repository.new
|
38
|
+
|
39
|
+
@options = {
|
40
|
+
repository: @repository,
|
41
|
+
fields: [:name, :email]
|
42
|
+
}
|
43
|
+
|
44
|
+
@data = {
|
45
|
+
'id' => 1,
|
46
|
+
'name' => 'Kowalski',
|
47
|
+
'email' => 'jan@kowalski.pl',
|
48
|
+
'key' => 'value'
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
test "call should create user if not exists in repository and return it" do
|
53
|
+
output = RailsSso::UpdateUser.new(@data, @options).call
|
54
|
+
|
55
|
+
assert_equal_user(@data, output)
|
56
|
+
|
57
|
+
user = @repository.find_by_sso_id(@data['id'])
|
58
|
+
|
59
|
+
assert_equal_user(@data, user)
|
60
|
+
end
|
61
|
+
|
62
|
+
test "call should update user if exists in repository and return it" do
|
63
|
+
@repository.create_with_sso_id(@data['id'], { 'email' => 'test@example.com', 'name' => 'Nowak' })
|
64
|
+
|
65
|
+
output = RailsSso::UpdateUser.new(@data, @options).call
|
66
|
+
|
67
|
+
assert_equal_user(@data, output)
|
68
|
+
|
69
|
+
user = @repository.find_by_sso_id(@data['id'])
|
70
|
+
|
71
|
+
assert_equal_user(@data, user)
|
72
|
+
end
|
73
|
+
|
74
|
+
def assert_equal_user(data, user)
|
75
|
+
assert_equal data['id'], user.id
|
76
|
+
assert_equal data['email'], user.email
|
77
|
+
assert_equal data['name'], user.name
|
78
|
+
end
|
79
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -4,6 +4,7 @@ ENV["RAILS_ENV"] = "test"
|
|
4
4
|
require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
|
5
5
|
ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
|
6
6
|
require "rails/test_help"
|
7
|
+
require "mocha/mini_test"
|
7
8
|
|
8
9
|
# Filter out Minitest backtrace while allowing backtrace from other libraries
|
9
10
|
# to be shown.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_sso
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Dudulski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -16,14 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 4.
|
19
|
+
version: '4.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 4.
|
26
|
+
version: '4.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday-http-cache
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: omniauth-oauth2
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.2'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.2'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: sqlite3
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +66,34 @@ dependencies:
|
|
38
66
|
- - ">="
|
39
67
|
- !ruby/object:Gem::Version
|
40
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: anima
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: mocha
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
41
97
|
description: Single Sign On solution via OAuth2 for Ruby on Rails.
|
42
98
|
email:
|
43
99
|
- jan@dudulski.pl
|
@@ -49,15 +105,17 @@ files:
|
|
49
105
|
- README.md
|
50
106
|
- Rakefile
|
51
107
|
- app/controllers/rails_sso/sessions_controller.rb
|
108
|
+
- app/services/rails_sso/fetch_user.rb
|
109
|
+
- app/services/rails_sso/update_user.rb
|
52
110
|
- config/initializers/omniauth.rb
|
53
111
|
- config/routes.rb
|
54
112
|
- lib/rails_sso.rb
|
113
|
+
- lib/rails_sso/access_token.rb
|
55
114
|
- lib/rails_sso/engine.rb
|
56
|
-
- lib/rails_sso/fetch_user.rb
|
57
115
|
- lib/rails_sso/helpers.rb
|
58
|
-
- lib/rails_sso/update_user.rb
|
59
116
|
- lib/rails_sso/version.rb
|
60
117
|
- lib/tasks/rails_sso_tasks.rake
|
118
|
+
- test/controllers/rails_sso/sessions_controller_test.rb
|
61
119
|
- test/dummy/README.rdoc
|
62
120
|
- test/dummy/Rakefile
|
63
121
|
- test/dummy/app/assets/javascripts/application.js
|
@@ -84,15 +142,20 @@ files:
|
|
84
142
|
- test/dummy/config/initializers/inflections.rb
|
85
143
|
- test/dummy/config/initializers/mime_types.rb
|
86
144
|
- test/dummy/config/initializers/session_store.rb
|
145
|
+
- test/dummy/config/initializers/sso.rb
|
87
146
|
- test/dummy/config/initializers/wrap_parameters.rb
|
88
147
|
- test/dummy/config/locales/en.yml
|
89
148
|
- test/dummy/config/routes.rb
|
90
149
|
- test/dummy/config/secrets.yml
|
150
|
+
- test/dummy/db/test.sqlite3
|
151
|
+
- test/dummy/log/test.log
|
91
152
|
- test/dummy/public/404.html
|
92
153
|
- test/dummy/public/422.html
|
93
154
|
- test/dummy/public/500.html
|
94
155
|
- test/dummy/public/favicon.ico
|
95
156
|
- test/rails_sso_test.rb
|
157
|
+
- test/services/rails_sso/fetch_user_test.rb
|
158
|
+
- test/services/rails_sso/update_user_test.rb
|
96
159
|
- test/test_helper.rb
|
97
160
|
homepage: https://github.com/monterail/rails_sso
|
98
161
|
licenses:
|
@@ -119,9 +182,13 @@ signing_key:
|
|
119
182
|
specification_version: 4
|
120
183
|
summary: SSO Rails Engine
|
121
184
|
test_files:
|
185
|
+
- test/controllers/rails_sso/sessions_controller_test.rb
|
122
186
|
- test/rails_sso_test.rb
|
123
187
|
- test/test_helper.rb
|
188
|
+
- test/services/rails_sso/fetch_user_test.rb
|
189
|
+
- test/services/rails_sso/update_user_test.rb
|
124
190
|
- test/dummy/README.rdoc
|
191
|
+
- test/dummy/db/test.sqlite3
|
125
192
|
- test/dummy/public/favicon.ico
|
126
193
|
- test/dummy/public/500.html
|
127
194
|
- test/dummy/public/422.html
|
@@ -138,6 +205,7 @@ test_files:
|
|
138
205
|
- test/dummy/config/initializers/session_store.rb
|
139
206
|
- test/dummy/config/initializers/backtrace_silencers.rb
|
140
207
|
- test/dummy/config/initializers/wrap_parameters.rb
|
208
|
+
- test/dummy/config/initializers/sso.rb
|
141
209
|
- test/dummy/config/initializers/mime_types.rb
|
142
210
|
- test/dummy/config/initializers/cookies_serializer.rb
|
143
211
|
- test/dummy/config/initializers/inflections.rb
|
@@ -154,4 +222,5 @@ test_files:
|
|
154
222
|
- test/dummy/app/controllers/application_controller.rb
|
155
223
|
- test/dummy/app/assets/javascripts/application.js
|
156
224
|
- test/dummy/app/assets/stylesheets/application.css
|
225
|
+
- test/dummy/log/test.log
|
157
226
|
- test/dummy/Rakefile
|
data/lib/rails_sso/fetch_user.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
module RailsSso
|
2
|
-
class FetchUser
|
3
|
-
def initialize(access_token, storage)
|
4
|
-
@access_token, @storage = access_token, storage
|
5
|
-
end
|
6
|
-
|
7
|
-
def get_and_cache
|
8
|
-
updater(get).call
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
attr_reader :access_token, :storage
|
14
|
-
|
15
|
-
def get(tries = 1)
|
16
|
-
access_token.get(RailsSso.provider_profile_path).parsed
|
17
|
-
rescue ::OAuth2::Error => e
|
18
|
-
if tries > 0
|
19
|
-
refresh_token!
|
20
|
-
|
21
|
-
get(0)
|
22
|
-
else
|
23
|
-
raise e
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def updater(data)
|
28
|
-
RailsSso::UpdateUser.new(data, updater_options)
|
29
|
-
end
|
30
|
-
|
31
|
-
def updater_options
|
32
|
-
{
|
33
|
-
fields: RailsSso.user_fields,
|
34
|
-
repository: RailsSso.user_repository.new
|
35
|
-
}
|
36
|
-
end
|
37
|
-
|
38
|
-
def refresh_token!
|
39
|
-
@access_token = access_token.refresh!
|
40
|
-
|
41
|
-
storage[:access_token] = access_token.token
|
42
|
-
storage[:refresh_token] = access_token.refresh_token
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|