gds-sso 0.4.1 → 0.4.2
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.
- data/README.md +4 -4
- data/Rakefile +2 -0
- data/lib/gds-sso/failure_app.rb +2 -2
- data/lib/gds-sso/omniauth_strategy.rb +2 -2
- data/lib/gds-sso/user.rb +10 -0
- data/lib/gds-sso/version.rb +1 -1
- data/lib/gds-sso/warden_config.rb +15 -11
- data/lib/gds-sso.rb +2 -2
- data/test/test_gds_sso_strategy.rb +19 -0
- data/test/test_http_strategy.rb +0 -0
- data/test/test_omniauth_strategy.rb +13 -4
- metadata +35 -20
data/README.md
CHANGED
@@ -4,7 +4,7 @@ GDS-SSO provides everything needed to integrate an application with the sign-on-
|
|
4
4
|
(https://github.com/alphagov/sign-on-o-tron) as used by the Government Digital Service, though it
|
5
5
|
will probably also work with a range of other oauth2 providers.
|
6
6
|
|
7
|
-
It is a wrapper around omniauth that adds a 'strategy' for oAuth2 integration against sign-on-o-tron,
|
7
|
+
It is a wrapper around omniauth that adds a 'strategy' for oAuth2 integration against sign-on-o-tron,
|
8
8
|
and the necessary controller to support that request flow.
|
9
9
|
|
10
10
|
For more details on OmniAuth and oAuth2 integration see https://github.com/intridea/omniauth
|
@@ -23,14 +23,14 @@ Create a `config/initializers/gds-sso.rb` that looks like:
|
|
23
23
|
|
24
24
|
GDS::SSO.config do |config|
|
25
25
|
config.user_model = 'User'
|
26
|
-
|
26
|
+
|
27
27
|
# set up ID and Secret in a way which doesn't require it to be checked in to source control...
|
28
28
|
config.oauth_id = ENV['OAUTH_ID']
|
29
29
|
config.oauth_secret = ENV['OAUTH_SECRET']
|
30
|
-
|
30
|
+
|
31
31
|
# optional config for location of sign-on-o-tron
|
32
32
|
config.oauth_root_url = "http://localhost:3001"
|
33
|
-
|
33
|
+
|
34
34
|
# optional config for API Access (requests which accept application/json)
|
35
35
|
config.basic_auth_user = 'api'
|
36
36
|
config.basic_auth_password = 'secret'
|
data/Rakefile
CHANGED
data/lib/gds-sso/failure_app.rb
CHANGED
@@ -2,7 +2,7 @@ require "action_controller/metal"
|
|
2
2
|
require 'rails'
|
3
3
|
|
4
4
|
# Failure application that will be called every time :warden is thrown from
|
5
|
-
# any strategy or hook.
|
5
|
+
# any strategy or hook.
|
6
6
|
module GDS
|
7
7
|
module SSO
|
8
8
|
class FailureApp < ActionController::Metal
|
@@ -32,7 +32,7 @@ module GDS
|
|
32
32
|
def store_location!
|
33
33
|
session["return_to"] = env['warden.options'][:attempted_path] if request.get?
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -8,7 +8,7 @@ require 'multi_json'
|
|
8
8
|
# use OmniAuth::Builder :gds, 'API Key', 'Secret Key'
|
9
9
|
|
10
10
|
class OmniAuth::Strategies::Gds < OmniAuth::Strategies::OAuth2
|
11
|
-
|
11
|
+
|
12
12
|
# @param [Rack Application] app standard middleware application parameter
|
13
13
|
# @param [String] api_key the application id as [provided by GDS]
|
14
14
|
# @param [String] secret_key the application secret as [provided by Bitly]
|
@@ -33,7 +33,7 @@ class OmniAuth::Strategies::Gds < OmniAuth::Strategies::OAuth2
|
|
33
33
|
super
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
protected
|
38
38
|
|
39
39
|
def fetch_user_data
|
data/lib/gds-sso/user.rb
CHANGED
@@ -2,6 +2,16 @@ require 'active_support/concern'
|
|
2
2
|
|
3
3
|
module GDS
|
4
4
|
module SSO
|
5
|
+
class ApiUser
|
6
|
+
def uid
|
7
|
+
0
|
8
|
+
end
|
9
|
+
|
10
|
+
def name
|
11
|
+
'API User'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
5
15
|
module User
|
6
16
|
def self.user_params_from_auth_hash(auth_hash)
|
7
17
|
{'uid' => auth_hash['uid'], 'email' => auth_hash['user_info']['email'], 'name' => auth_hash['user_info']['name'], 'version' => auth_hash['extra']['user_hash']['version']}
|
data/lib/gds-sso/version.rb
CHANGED
@@ -18,7 +18,7 @@ Warden::Strategies.add(:gds_sso) do
|
|
18
18
|
Rails.logger.debug("Authenticating with gds_sso strategy")
|
19
19
|
|
20
20
|
if request.env['omniauth.auth'].nil?
|
21
|
-
fail!("No credentials, bub")
|
21
|
+
fail!("No credentials, bub")
|
22
22
|
else
|
23
23
|
user = prep_user(request.env['omniauth.auth'])
|
24
24
|
success!(user)
|
@@ -35,41 +35,45 @@ Warden::Strategies.add(:gds_sso) do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
Warden::Strategies.add(:gds_sso_api_access) do
|
38
|
+
def api_user
|
39
|
+
@api_user ||= GDS::SSO::ApiUser.new
|
40
|
+
end
|
41
|
+
|
38
42
|
def valid?
|
39
43
|
::GDS::SSO::ApiAccess.api_call?(env)
|
40
44
|
end
|
41
|
-
|
45
|
+
|
42
46
|
def authenticate!
|
43
47
|
Rails.logger.debug("Authenticating with gds_sso_api_access strategy")
|
44
48
|
|
45
49
|
if ! basic_auth_configured?
|
46
50
|
Rails.logger.debug("Basic auth not configured, not requiring authentication")
|
47
|
-
success!(
|
51
|
+
success!(api_user)
|
48
52
|
end
|
49
|
-
|
53
|
+
|
50
54
|
auth = Rack::Auth::Basic::Request.new(env)
|
51
55
|
|
52
56
|
return custom!(unauthorized) unless auth.provided?
|
53
57
|
return fail!(:bad_request) unless auth.basic?
|
54
|
-
|
58
|
+
|
55
59
|
if valid_api_user?(*auth.credentials)
|
56
60
|
success!(auth.credentials[0])
|
57
61
|
else
|
58
62
|
custom!(unauthorized)
|
59
63
|
end
|
60
64
|
end
|
61
|
-
|
65
|
+
|
62
66
|
def basic_auth_configured?
|
63
67
|
! ::GDS::SSO::Config.basic_auth_user.nil?
|
64
68
|
end
|
65
|
-
|
69
|
+
|
66
70
|
def valid_api_user?(username, password)
|
67
|
-
username.to_s.strip != '' &&
|
68
|
-
password.to_s.strip != '' &&
|
71
|
+
username.to_s.strip != '' &&
|
72
|
+
password.to_s.strip != '' &&
|
69
73
|
username == ::GDS::SSO::Config.basic_auth_user &&
|
70
74
|
password == ::GDS::SSO::Config.basic_auth_password
|
71
75
|
end
|
72
|
-
|
76
|
+
|
73
77
|
def unauthorized
|
74
78
|
[
|
75
79
|
401,
|
@@ -103,7 +107,7 @@ Warden::Strategies.add(:mock_gds_sso_api_access) do
|
|
103
107
|
def valid?
|
104
108
|
::GDS::SSO::ApiAccess.api_call?(env)
|
105
109
|
end
|
106
|
-
|
110
|
+
|
107
111
|
def authenticate!
|
108
112
|
Rails.logger.debug("Authenticating with mock_gds_sso_api_access strategy")
|
109
113
|
success!(GDS::SSO.test_user || GDS::SSO::Config.user_klass.first)
|
data/lib/gds-sso.rb
CHANGED
@@ -23,7 +23,7 @@ module GDS
|
|
23
23
|
# Force routes to be loaded if we are doing any eager load.
|
24
24
|
# TODO - check this one - Stolen from Devise because it looked sensible...
|
25
25
|
config.before_eager_load { |app| app.reload_routes! }
|
26
|
-
|
26
|
+
|
27
27
|
config.app_middleware.use ::OmniAuth::Builder do
|
28
28
|
provider :gds, GDS::SSO::Config.oauth_id, GDS::SSO::Config.oauth_secret
|
29
29
|
end
|
@@ -31,7 +31,7 @@ module GDS
|
|
31
31
|
def self.use_mock_strategies?
|
32
32
|
['development', 'test'].include?(Rails.env) && ENV['GDS_SSO_STRATEGY'] != 'real'
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
def self.default_strategies
|
36
36
|
use_mock_strategies? ? [:mock_gds_sso, :mock_gds_sso_api_access] : [:gds_sso, :gds_sso_api_access]
|
37
37
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'json'
|
3
|
+
require 'gds-sso'
|
4
|
+
require 'gds-sso/omniauth_strategy'
|
5
|
+
require 'capybara/dsl'
|
6
|
+
|
7
|
+
class TestGdsSsoStrategy < Test::Unit::TestCase
|
8
|
+
include OmniAuth::Test::StrategyTestCase
|
9
|
+
include Capybara::DSL
|
10
|
+
|
11
|
+
def strategy
|
12
|
+
# return the parameters to a Rack::Builder map call:
|
13
|
+
[OmniAuth::Strategies::Gds.new, 'client_id', 'client_secret']
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup
|
17
|
+
# post '/auth/gds_sso/callback', :user => { 'name' => 'Dylan', 'id' => '445' }
|
18
|
+
end
|
19
|
+
end
|
File without changes
|
@@ -7,7 +7,16 @@ class TestOmniAuthStrategy < Test::Unit::TestCase
|
|
7
7
|
def setup
|
8
8
|
@app = stub("app")
|
9
9
|
@strategy = OmniAuth::Strategies::Gds.new(@app, :gds, 'client_id', 'client_secret')
|
10
|
-
@strategy.stubs(:fetch_user_data).returns({
|
10
|
+
@strategy.stubs(:fetch_user_data).returns({
|
11
|
+
'user' => {
|
12
|
+
'uid' => 'abcde',
|
13
|
+
'version' => 1,
|
14
|
+
'name' => 'Matt Patterson',
|
15
|
+
'email' => 'matt@alphagov.co.uk',
|
16
|
+
'github' => 'fidothe',
|
17
|
+
'twitter' => 'fidothe'
|
18
|
+
}
|
19
|
+
}.to_json)
|
11
20
|
end
|
12
21
|
|
13
22
|
def test_build_auth_hash_returns_name_and_email
|
@@ -16,13 +25,13 @@ class TestOmniAuthStrategy < Test::Unit::TestCase
|
|
16
25
|
end
|
17
26
|
|
18
27
|
def test_build_auth_hash_contains_extra_info
|
19
|
-
expected = {'uid' => 'abcde', 'version' => 1, 'name' => 'Matt Patterson', 'email' => 'matt@alphagov.co.uk', 'github' => 'fidothe', 'twitter' => 'fidothe'}
|
28
|
+
expected = {'uid' => 'abcde', 'version' => 1, 'name' => 'Matt Patterson', 'email' => 'matt@alphagov.co.uk', 'github' => 'fidothe', 'twitter' => 'fidothe'}
|
20
29
|
assert_equal expected, @strategy.send(:build_auth_hash)['extra']['user_hash']
|
21
30
|
end
|
22
|
-
|
31
|
+
|
23
32
|
def test_oauth_bypassed_if_json_is_accepted_by_request
|
24
33
|
@app.expects(:call)
|
25
34
|
rack_env = { "HTTP_ACCEPT" => 'application/json' }
|
26
35
|
@strategy.call(rack_env)
|
27
36
|
end
|
28
|
-
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gds-sso
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-01-
|
13
|
+
date: 2012-01-24 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
17
|
-
requirement: &
|
17
|
+
requirement: &70147169913100 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 3.0.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70147169913100
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: warden
|
28
|
-
requirement: &
|
28
|
+
requirement: &70147169912600 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - =
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 1.0.6
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70147169912600
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: oauth2
|
39
|
-
requirement: &
|
39
|
+
requirement: &70147169912140 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - =
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 0.4.1
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70147169912140
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: oa-oauth
|
50
|
-
requirement: &
|
50
|
+
requirement: &70147169911680 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - =
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: 0.2.6
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *70147169911680
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: oa-core
|
61
|
-
requirement: &
|
61
|
+
requirement: &70147169911220 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - =
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: 0.2.6
|
67
67
|
type: :runtime
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *70147169911220
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rack-accept
|
72
|
-
requirement: &
|
72
|
+
requirement: &70147169910760 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ~>
|
@@ -77,10 +77,10 @@ dependencies:
|
|
77
77
|
version: 0.4.4
|
78
78
|
type: :runtime
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *70147169910760
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: plek
|
83
|
-
requirement: &
|
83
|
+
requirement: &70147169910380 !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
86
86
|
- - ! '>='
|
@@ -88,10 +88,10 @@ dependencies:
|
|
88
88
|
version: '0'
|
89
89
|
type: :runtime
|
90
90
|
prerelease: false
|
91
|
-
version_requirements: *
|
91
|
+
version_requirements: *70147169910380
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
93
|
name: rake
|
94
|
-
requirement: &
|
94
|
+
requirement: &70147169909840 !ruby/object:Gem::Requirement
|
95
95
|
none: false
|
96
96
|
requirements:
|
97
97
|
- - ~>
|
@@ -99,10 +99,10 @@ dependencies:
|
|
99
99
|
version: 0.9.2
|
100
100
|
type: :development
|
101
101
|
prerelease: false
|
102
|
-
version_requirements: *
|
102
|
+
version_requirements: *70147169909840
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: mocha
|
105
|
-
requirement: &
|
105
|
+
requirement: &70147169909340 !ruby/object:Gem::Requirement
|
106
106
|
none: false
|
107
107
|
requirements:
|
108
108
|
- - ~>
|
@@ -110,7 +110,18 @@ dependencies:
|
|
110
110
|
version: 0.9.0
|
111
111
|
type: :development
|
112
112
|
prerelease: false
|
113
|
-
version_requirements: *
|
113
|
+
version_requirements: *70147169909340
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
name: capybara
|
116
|
+
requirement: &70147169908960 !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
118
|
+
requirements:
|
119
|
+
- - ! '>='
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
type: :development
|
123
|
+
prerelease: false
|
124
|
+
version_requirements: *70147169908960
|
114
125
|
description: Client for GDS' OAuth 2-based SSO
|
115
126
|
email:
|
116
127
|
- matt@constituentparts.com
|
@@ -135,7 +146,9 @@ files:
|
|
135
146
|
- README.md
|
136
147
|
- Gemfile
|
137
148
|
- Rakefile
|
149
|
+
- test/test_gds_sso_strategy.rb
|
138
150
|
- test/test_helper.rb
|
151
|
+
- test/test_http_strategy.rb
|
139
152
|
- test/test_omniauth_strategy.rb
|
140
153
|
- test/test_user.rb
|
141
154
|
homepage: https://github.com/alphagov/gds-sso
|
@@ -163,6 +176,8 @@ signing_key:
|
|
163
176
|
specification_version: 3
|
164
177
|
summary: Client for GDS' OAuth 2-based SSO
|
165
178
|
test_files:
|
179
|
+
- test/test_gds_sso_strategy.rb
|
166
180
|
- test/test_helper.rb
|
181
|
+
- test/test_http_strategy.rb
|
167
182
|
- test/test_omniauth_strategy.rb
|
168
183
|
- test/test_user.rb
|