omniauthv2-shibboleth 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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