omniauthv2-shibboleth 1.3.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.
@@ -0,0 +1,362 @@
1
+ require 'spec_helper'
2
+
3
+ def make_env(path = '/auth/shibboleth', props = {})
4
+ {
5
+ 'REQUEST_METHOD' => 'GET',
6
+ 'PATH_INFO' => path,
7
+ 'rack.session' => {},
8
+ 'rack.input' => StringIO.new('test=true')
9
+ }.merge(props)
10
+ end
11
+
12
+ def without_session_failure_path
13
+ if OmniAuth::VERSION >= "1.0" && OmniAuth::VERSION < "1.1"
14
+ "/auth/failure?message=no_shibboleth_session"
15
+ elsif OmniAuth::VERSION >= "1.1"
16
+ "/auth/failure?message=no_shibboleth_session&strategy=shibboleth"
17
+ end
18
+ end
19
+
20
+ def empty_uid_failure_path
21
+ if OmniAuth::VERSION >= "1.0" && OmniAuth::VERSION < "1.1"
22
+ "/auth/failure?message=empty_uid"
23
+ elsif OmniAuth::VERSION >= "1.1"
24
+ "/auth/failure?message=empty_uid&strategy=shibboleth"
25
+ end
26
+ end
27
+
28
+ describe OmniAuth::Strategies::Shibboleth do
29
+ OmniAuth.config.request_validation_phase = nil # disable CSRF validation for tests
30
+
31
+ let(:app){ Rack::Builder.new do |b|
32
+ b.use Rack::Session::Cookie, {:secret => "OTVJZXSTpoCFV37QeliMRZNeAfXqsAWciAp9msTWtpILqoBEIGtI5jo7FfswV9i7"}
33
+ b.use OmniAuth::Strategies::Shibboleth
34
+ b.run lambda{|env| [200, {}, ['Not Found']]}
35
+ end.to_app }
36
+
37
+ context 'request phase' do
38
+ before do
39
+ post '/auth/shibboleth'
40
+ end
41
+
42
+ it 'is expected to redirect to callback_url' do
43
+ expect(last_response.status).to eq(302)
44
+ expect(last_response.location).to eq('/auth/shibboleth/callback')
45
+ end
46
+ end
47
+
48
+ context 'callback phase' do
49
+ context 'without Shibboleth session' do
50
+ before do
51
+ get '/auth/shibboleth/callback'
52
+ end
53
+
54
+ it 'is expected to fail to get Shib-Session-ID environment variable' do
55
+ expect(last_response.status).to eq(302)
56
+ expect(last_response.location).to eq(without_session_failure_path)
57
+ end
58
+ end
59
+
60
+ context 'with Shibboleth session' do
61
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, {}) }
62
+
63
+ it 'is expected to set default omniauth.auth fields' do
64
+ @dummy_id = 'abcdefg'
65
+ @eppn = 'test@example.com'
66
+ @display_name = 'Test User'
67
+ env = make_env('/auth/shibboleth/callback', 'Shib-Session-ID' => @dummy_id, 'eppn' => @eppn, 'displayName' => @display_name)
68
+ strategy.call!(env)
69
+ expect(strategy.env['omniauth.auth']['uid']).to eq(@eppn)
70
+ expect(strategy.env['omniauth.auth']['info']['name']).to eq(@display_name)
71
+ end
72
+ end
73
+
74
+ context 'with Shibboleth session and attribute options' do
75
+ let(:options){ {
76
+ :shib_session_id_field => 'Shib-Session-ID',
77
+ :shib_application_id_field => 'Shib-Application-ID',
78
+ :uid_field => :uid,
79
+ :name_field => :sn,
80
+ :info_fields => {},
81
+ :extra_fields => [:o, :affiliation] } }
82
+ let(:app){ lambda{|env| [404, {}, ['Not Found']]}}
83
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
84
+
85
+ it 'is expected to set specified omniauth.auth fields' do
86
+ @dummy_id = 'abcdefg'
87
+ @uid = 'test'
88
+ @sn = 'User'
89
+ @organization = 'Test Corporation'
90
+ @affiliation = 'faculty'
91
+ env = make_env('/auth/shibboleth/callback', 'Shib-Session-ID' => @dummy_id, 'uid' => @uid, 'sn' => @sn, 'o' => @organization, 'affiliation' => @affiliation)
92
+ strategy.call!(env)
93
+ expect(strategy.env['omniauth.auth']['uid']).to eq(@uid)
94
+ expect(strategy.env['omniauth.auth']['extra']['raw_info']['o']).to eq(@organization)
95
+ expect(strategy.env['omniauth.auth']['extra']['raw_info']['affiliation']).to eq(@affiliation)
96
+ end
97
+ end
98
+
99
+ context 'with debug options' do
100
+ let(:options) { { :debug => true } }
101
+ let(:app){ lambda{|env| [404, {}, ['Not Found']]}}
102
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
103
+
104
+ it 'is expected to raise environment variables' do
105
+ @dummy_id = 'abcdefg'
106
+ @eppn = 'test@example.com'
107
+ @display_name = 'Test User'
108
+ env = make_env('/auth/shibboleth/callback', 'Shib-Session-ID' => @dummy_id, 'eppn' => @eppn, 'displayName' => @display_name)
109
+ response = strategy.call!(env)
110
+ expect(response[0]).to eq(200)
111
+ end
112
+ end
113
+
114
+ context 'with request_type = :header' do
115
+ let(:options){ {
116
+ :request_type => :header,
117
+ :shib_session_id_field => 'Shib-Session-ID',
118
+ :shib_application_id_field => 'Shib-Application-ID',
119
+ :uid_field => :uid,
120
+ :name_field => :displayName,
121
+ :info_fields => {},
122
+ :extra_fields => [:o, :affiliation] } }
123
+ let(:app){ lambda{|env| [200, {}, ['OK']]}}
124
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
125
+
126
+ it 'is expected to handle header variables' do
127
+ @dummy_id = 'abcdefg'
128
+ @display_name = 'Test User'
129
+ @uid = 'test'
130
+ @organization = 'Test Corporation'
131
+ @affiliation = 'faculty'
132
+ env = make_env('/auth/shibboleth/callback', 'HTTP_SHIB_SESSION_ID' => @dummy_id, 'HTTP_DISPLAYNAME' => @display_name, 'HTTP_UID' => @uid, 'HTTP_O' => @organization, 'HTTP_AFFILIATION' => @affiliation)
133
+ strategy.call!(env)
134
+ expect(strategy.env['omniauth.auth']['uid']).to eq(@uid)
135
+ expect(strategy.env['omniauth.auth']['info']['name']).to eq(@display_name)
136
+ expect(strategy.env['omniauth.auth']['extra']['raw_info']['o']).to eq(@organization)
137
+ expect(strategy.env['omniauth.auth']['extra']['raw_info']['affiliation']).to eq(@affiliation)
138
+ end
139
+ end
140
+
141
+ context "with request_type = 'header'" do
142
+ let(:options){ {
143
+ :request_type => 'header',
144
+ :shib_session_id_field => 'Shib-Session-ID',
145
+ :shib_application_id_field => 'Shib-Application-ID',
146
+ :uid_field => :uid,
147
+ :name_field => :displayName,
148
+ :info_fields => {},
149
+ :extra_fields => [:o, :affiliation] } }
150
+ let(:app){ lambda{|env| [200, {}, ['OK']]}}
151
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
152
+
153
+ it 'is expected to handle header variables' do
154
+ @dummy_id = 'abcdefg'
155
+ @display_name = 'Test User'
156
+ @uid = 'test'
157
+ @organization = 'Test Corporation'
158
+ @affiliation = 'faculty'
159
+ env = make_env('/auth/shibboleth/callback', 'HTTP_SHIB_SESSION_ID' => @dummy_id, 'HTTP_DISPLAYNAME' => @display_name, 'HTTP_UID' => @uid, 'HTTP_O' => @organization, 'HTTP_AFFILIATION' => @affiliation)
160
+ strategy.call!(env)
161
+ expect(strategy.env['omniauth.auth']['uid']).to eq(@uid)
162
+ expect(strategy.env['omniauth.auth']['info']['name']).to eq(@display_name)
163
+ expect(strategy.env['omniauth.auth']['extra']['raw_info']['o']).to eq(@organization)
164
+ expect(strategy.env['omniauth.auth']['extra']['raw_info']['affiliation']).to eq(@affiliation)
165
+ end
166
+ end
167
+
168
+ context 'with request_type = :params' do
169
+ let(:options){ {
170
+ :request_type => :params,
171
+ :shib_session_id_field => 'Shib-Session-ID',
172
+ :shib_application_id_field => 'Shib-Application-ID',
173
+ :uid_field => :uid,
174
+ :name_field => :displayName,
175
+ :info_fields => {},
176
+ :extra_fields => [:o, :affiliation] } }
177
+ let(:app){ lambda{|env| [200, {}, ['OK']]}}
178
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
179
+
180
+ it 'is expected to handle params variables' do
181
+ @dummy_id = 'abcdefg'
182
+ @display_name = 'Test User'
183
+ @uid = 'test'
184
+ @organization = 'Test Corporation'
185
+ @affiliation = 'faculty'
186
+ env = make_env('/auth/shibboleth/callback', 'QUERY_STRING' => "Shib-Session-ID=#{@dummy_id}&uid=#{@uid}&displayName=#{@display_name}&o=#{@organization}&affiliation=#{@affiliation}")
187
+ strategy.call!(env)
188
+ expect(strategy.env['omniauth.auth']['uid']).to eq(@uid)
189
+ expect(strategy.env['omniauth.auth']['info']['name']).to eq(@display_name)
190
+ expect(strategy.env['omniauth.auth']['extra']['raw_info']['o']).to eq(@organization)
191
+ expect(strategy.env['omniauth.auth']['extra']['raw_info']['affiliation']).to eq(@affiliation)
192
+ end
193
+ end
194
+
195
+ context 'with Proc option' do
196
+ let(:options){ {
197
+ :request_type => :env,
198
+ :shib_session_id_field => 'Shib-Session-ID',
199
+ :shib_application_id_field => 'Shib-Application-ID',
200
+ :uid_field => lambda {|request_param| request_param.call('eppn') || request_param.call('mail')},
201
+ :name_field => lambda {|request_param| "#{request_param.call('cn')} #{request_param.call('sn')}"},
202
+ :info_fields => {:affiliation => lambda {|request_param| "#{request_param.call('affiliation')}@my.localdomain" }},
203
+ :extra_fields => [:o, :affiliation] } }
204
+ let(:app){ lambda{|env| [200, {}, ['OK']]}}
205
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
206
+
207
+ it 'is expected to have eppn as uid and cn + sn as name field.' do
208
+ @dummy_id = 'abcdefg'
209
+ @display_name = 'Test User'
210
+ @uid = 'test'
211
+ @eppn = 'test@my.localdomain'
212
+ @cn = 'Test'
213
+ @sn = 'User'
214
+ @organization = 'Test Corporation'
215
+ @affiliation = 'faculty'
216
+ env = make_env('/auth/shibboleth/callback', 'Shib-Session-ID' => @dummy_id, 'uid' => @uid, 'eppn' => @eppn, 'cn' => @cn, 'sn' => @sn, 'o' => @organization, 'affiliation' => @affiliation)
217
+ strategy.call!(env)
218
+ expect(strategy.env['omniauth.auth']['uid']).to eq(@eppn)
219
+ expect(strategy.env['omniauth.auth']['info']['name']).to eq("#{@cn} #{@sn}")
220
+ expect(strategy.env['omniauth.auth']['info']['affiliation']).to eq("#{@affiliation}@my.localdomain")
221
+ expect(strategy.env['omniauth.auth']['extra']['raw_info']['o']).to eq(@organization)
222
+ expect(strategy.env['omniauth.auth']['extra']['raw_info']['affiliation']).to eq(@affiliation)
223
+ end
224
+
225
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
226
+ it 'is expected to have mail as uid and cn + sn as name field.' do
227
+ @dummy_id = 'abcdefg'
228
+ @display_name = 'Test User'
229
+ @uid = 'test'
230
+ @mail = 'test@my.localdomain'
231
+ @cn = 'Test'
232
+ @sn = 'User'
233
+ @organization = 'Test Corporation'
234
+ @affiliation = 'faculty'
235
+ env = make_env('/auth/shibboleth/callback', 'Shib-Session-ID' => @dummy_id, 'uid' => @uid, 'mail' => @mail, 'cn' => @cn, 'sn' => @sn, 'o' => @organization, 'affiliation' => @affiliation)
236
+ strategy.call!(env)
237
+ expect(strategy.env['omniauth.auth']['uid']).to eq(@mail)
238
+ expect(strategy.env['omniauth.auth']['info']['name']).to eq("#{@cn} #{@sn}")
239
+ expect(strategy.env['omniauth.auth']['info']['affiliation']).to eq("#{@affiliation}@my.localdomain")
240
+ expect(strategy.env['omniauth.auth']['extra']['raw_info']['o']).to eq(@organization)
241
+ expect(strategy.env['omniauth.auth']['extra']['raw_info']['affiliation']).to eq(@affiliation)
242
+ end
243
+ end
244
+
245
+ context 'empty uid with :fail_with_empty_uid = false' do
246
+ let(:options){ {
247
+ :request_type => :env,
248
+ :fail_with_empty_uid => false,
249
+ :uid_field => :uid,
250
+ :name_field => :displayName,
251
+ :info_fields => {} } }
252
+ let(:app){ lambda{|env| [200, {}, ['OK']]}}
253
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
254
+
255
+ it 'is expected to output null (empty) uid as it is' do
256
+ @dummy_id = 'abcdefg'
257
+ @display_name = 'Test User'
258
+ @uid = ''
259
+ env = make_env('/auth/shibboleth/callback', 'Shib-Session-ID' => @dummy_id, 'uid' => @uid, 'displayName' => @display_name)
260
+ strategy.call!(env)
261
+ expect(strategy.env['omniauth.auth']['uid']).to eq(@uid)
262
+ end
263
+ end
264
+
265
+ context 'empty uid with :fail_with_empty_uid = true' do
266
+ let(:options){ {
267
+ :request_type => :env,
268
+ :fail_with_empty_uid => true,
269
+ :shib_session_id_field => 'Shib-Session-ID',
270
+ :shib_application_id_field => 'Shib-Application-ID',
271
+ :uid_field => :uid,
272
+ :name_field => :displayName,
273
+ :info_fields => {} } }
274
+ let(:app){ lambda{|env| [200, {}, ['OK']]}}
275
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
276
+
277
+ it 'is expected to fail because of the empty uid' do
278
+ @dummy_id = 'abcdefg'
279
+ @display_name = 'Test User'
280
+ @uid = ''
281
+ env = make_env('/auth/shibboleth/callback', 'Shib-Session-ID' => @dummy_id, 'uid' => @uid, 'displayName' => @display_name)
282
+ response = strategy.call!(env)
283
+ expect(response[0]).to eq(302)
284
+ expect(response[1]["Location"]).to eq(empty_uid_failure_path)
285
+ end
286
+ end
287
+
288
+ context 'with :multi_values => :raw' do
289
+ let(:options){ {
290
+ :request_type => :env,
291
+ :shib_session_id_field => 'Shib-Session-ID',
292
+ :shib_application_id_field => 'Shib-Application-ID',
293
+ :uid_field => :uid,
294
+ :name_field => :displayName,
295
+ :info_fields => {:email => "mail"} } }
296
+ let(:app){ lambda{|env| [200, {}, ['OK']]}}
297
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
298
+
299
+ it 'is expected to return the raw value' do
300
+ @dummy_id = 'abcdefg'
301
+ @display_name = 'Test User'
302
+ @uid = 'test'
303
+ @mail = 'test2\;hoge@example.com;test1\;hoge@example.com;test3\;hoge@example.com'
304
+ env = make_env('/auth/shibboleth/callback', 'Shib-Session-ID' => @dummy_id, 'uid' => @uid, 'displayName' => @display_name, 'mail' => @mail)
305
+ strategy.call!(env)
306
+ expect(strategy.env['omniauth.auth']['uid']).to eq(@uid)
307
+ expect(strategy.env['omniauth.auth']['info']['name']).to eq(@display_name)
308
+ expect(strategy.env['omniauth.auth']['info']['email']).to eq(@mail)
309
+ end
310
+ end
311
+
312
+ context 'with :multi_values => :first' do
313
+ let(:options){ {
314
+ :multi_values => :first,
315
+ :request_type => :env,
316
+ :shib_session_id_field => 'Shib-Session-ID',
317
+ :shib_application_id_field => 'Shib-Application-ID',
318
+ :uid_field => :uid,
319
+ :name_field => :displayName,
320
+ :info_fields => {:email => "mail"} } }
321
+ let(:app){ lambda{|env| [200, {}, ['OK']]}}
322
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
323
+
324
+ it 'is expected return the first value by specifying :first' do
325
+ @dummy_id = 'abcdefg'
326
+ @display_name = 'Test User'
327
+ @uid = 'test'
328
+ @mail = 'test2\;hoge@example.com;test1\;hoge@example.com;test3\;hoge@example.com'
329
+ env = make_env('/auth/shibboleth/callback', 'Shib-Session-ID' => @dummy_id, 'uid' => @uid, 'displayName' => @display_name, 'mail' => @mail)
330
+ strategy.call!(env)
331
+ expect(strategy.env['omniauth.auth']['uid']).to eq(@uid)
332
+ expect(strategy.env['omniauth.auth']['info']['name']).to eq(@display_name)
333
+ expect(strategy.env['omniauth.auth']['info']['email']).to eq('test2;hoge@example.com')
334
+ end
335
+ end
336
+
337
+ context 'with :multi_values => lambda function' do
338
+ let(:options){ {
339
+ :multi_values => "lambda {|param_value| param_value.nil? ? nil : param_value.split(/(?<!\\\\);/).sort[0].gsub('\\;',';')}",
340
+ :request_type => :env,
341
+ :shib_session_id_field => 'Shib-Session-ID',
342
+ :shib_application_id_field => 'Shib-Application-ID',
343
+ :uid_field => :uid,
344
+ :name_field => :displayName,
345
+ :info_fields => {:email => "mail"} } }
346
+ let(:app){ lambda{|env| [200, {}, ['OK']]}}
347
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
348
+ it 'is expected return the processed value by specifying lambda function' do
349
+ @dummy_id = 'abcdefg'
350
+ @display_name = 'Test User'
351
+ @uid = 'test'
352
+ @mail = 'test2\;hoge@example.com;test1\;hoge@example.com;test3\;hoge@example.com'
353
+ env = make_env('/auth/shibboleth/callback', 'Shib-Session-ID' => @dummy_id, 'uid' => @uid, 'displayName' => @display_name, 'mail' => @mail)
354
+ strategy.call!(env)
355
+ expect(strategy.env['omniauth.auth']['uid']).to eq(@uid)
356
+ expect(strategy.env['omniauth.auth']['info']['name']).to eq(@display_name)
357
+ expect(strategy.env['omniauth.auth']['info']['email']).to eq('test1;hoge@example.com')
358
+ end
359
+ end
360
+
361
+ end
362
+ end
@@ -0,0 +1,11 @@
1
+ require 'rspec'
2
+ require 'rack/test'
3
+ require 'rack/session/cookie'
4
+ require 'omniauth'
5
+ require 'omniauth/version'
6
+ require 'omniauth-shibboleth'
7
+
8
+ RSpec.configure do |config|
9
+ config.include Rack::Test::Methods
10
+ config.color = true
11
+ end
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniauthv2-shibboleth
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.1
5
+ platform: ruby
6
+ authors:
7
+ - Toyokazu Akiyama
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-05-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: omniauth
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rack-test
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rack-session
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '2.8'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '2.8'
83
+ description: OmniAuth Shibboleth strategies for OmniAuth 1.x
84
+ email:
85
+ - toyokazu@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".idea/misc.xml"
91
+ - ".idea/modules.xml"
92
+ - ".idea/omniauth-shibboleth.iml"
93
+ - ".idea/vcs.xml"
94
+ - ".idea/workspace.xml"
95
+ - Gemfile
96
+ - Gemfile.lock
97
+ - README.md
98
+ - Rakefile
99
+ - lib/omniauth-shibboleth.rb
100
+ - lib/omniauth-shibboleth/version.rb
101
+ - lib/omniauth/strategies/shibboleth.rb
102
+ - omniauth-shibboleth-1.3.1.gem
103
+ - omniauth-shibboleth.gemspec
104
+ - spec/omniauth/strategies/shibboleth_spec.rb
105
+ - spec/spec_helper.rb
106
+ homepage: ''
107
+ licenses:
108
+ - MIT
109
+ metadata: {}
110
+ post_install_message:
111
+ rdoc_options: []
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubygems_version: 3.2.3
126
+ signing_key:
127
+ specification_version: 4
128
+ summary: OmniAuth Shibboleth strategies for OmniAuth 1.x
129
+ test_files:
130
+ - spec/omniauth/strategies/shibboleth_spec.rb
131
+ - spec/spec_helper.rb