gds-sso 9.2.1 → 9.2.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/Rakefile +1 -8
- data/lib/gds-sso/user.rb +15 -3
- data/lib/gds-sso/version.rb +1 -1
- data/lib/gds-sso/warden_config.rb +3 -2
- data/spec/controller/api_user_controller_spec.rb +22 -24
- data/spec/fixtures/integration/signonotron2.sql +2 -1
- data/spec/internal/db/combustion_test.sqlite +0 -0
- data/spec/internal/log/test.log +206 -206
- data/spec/requests/end_to_end_spec.rb +21 -19
- data/spec/spec_helper.rb +9 -1
- data/spec/support/timecop.rb +7 -0
- data/spec/unit/api_access_spec.rb +27 -0
- data/spec/unit/session_serialisation_spec.rb +62 -0
- data/{test/user_test.rb → spec/unit/user_spec.rb} +5 -5
- metadata +14 -32
- data/spec/requests/authentication_soot2.rb +0 -116
- data/test/api_access_test.rb +0 -27
- data/test/session_serialisation_test.rb +0 -58
- data/test/test_helper.rb +0 -8
@@ -23,17 +23,17 @@ describe "Integration of client using GDS-SSO with signonotron" do
|
|
23
23
|
|
24
24
|
specify "a non-restricted page can be accessed without authentication" do
|
25
25
|
visit "http://#{@client_host}/"
|
26
|
-
page.
|
26
|
+
expect(page).to have_content('jabberwocky')
|
27
27
|
end
|
28
28
|
|
29
29
|
specify "first access to a restricted page requires authentication and application approval" do
|
30
30
|
visit "http://#{@client_host}/restricted"
|
31
|
-
page.
|
31
|
+
expect(page).to have_content("Sign in")
|
32
32
|
fill_in "Email", :with => "test@example-client.com"
|
33
33
|
fill_in "Passphrase", :with => "q1w2e3r4t5y6u7i8o9p0"
|
34
34
|
click_on "Sign in"
|
35
35
|
|
36
|
-
page.
|
36
|
+
expect(page).to have_content('restricted kablooie')
|
37
37
|
end
|
38
38
|
|
39
39
|
specify "access to a restricted page for an approved application requires only authentication" do
|
@@ -48,12 +48,13 @@ describe "Integration of client using GDS-SSO with signonotron" do
|
|
48
48
|
page.driver.header 'accept', 'text/html'
|
49
49
|
|
50
50
|
visit "http://#{@client_host}/restricted"
|
51
|
-
page.
|
51
|
+
expect(page).to have_content("Sign in")
|
52
|
+
|
52
53
|
fill_in "Email", :with => "test@example-client.com"
|
53
54
|
fill_in "Passphrase", :with => "q1w2e3r4t5y6u7i8o9p0"
|
54
55
|
click_on "Sign in"
|
55
56
|
|
56
|
-
page.
|
57
|
+
expect(page).to have_content('restricted kablooie')
|
57
58
|
end
|
58
59
|
|
59
60
|
specify "access to a page that requires signin permission granted" do
|
@@ -68,12 +69,13 @@ describe "Integration of client using GDS-SSO with signonotron" do
|
|
68
69
|
page.driver.header 'accept', 'text/html'
|
69
70
|
|
70
71
|
visit "http://#{@client_host}/this_requires_signin_permission"
|
71
|
-
page.
|
72
|
+
expect(page).to have_content("Sign in")
|
73
|
+
|
72
74
|
fill_in "Email", :with => "test@example-client.com"
|
73
75
|
fill_in "Passphrase", :with => "q1w2e3r4t5y6u7i8o9p0"
|
74
76
|
click_on "Sign in"
|
75
77
|
|
76
|
-
page.
|
78
|
+
expect(page).to have_content('you have signin permission')
|
77
79
|
end
|
78
80
|
|
79
81
|
describe "remotely signed out" do
|
@@ -85,7 +87,7 @@ describe "Integration of client using GDS-SSO with signonotron" do
|
|
85
87
|
click_on "Sign in"
|
86
88
|
|
87
89
|
page.driver.header 'accept', 'text/html'
|
88
|
-
page.
|
90
|
+
expect(page).to have_content('restricted kablooie')
|
89
91
|
|
90
92
|
# logout from signon
|
91
93
|
visit "http://localhost:4567/users/sign_out"
|
@@ -99,48 +101,48 @@ describe "Integration of client using GDS-SSO with signonotron" do
|
|
99
101
|
visit "http://#{@client_host}/restricted"
|
100
102
|
|
101
103
|
# be redirected to signon
|
102
|
-
page.
|
104
|
+
expect(page).to have_content('GOV.UK Signon')
|
103
105
|
fill_in "Email", :with => "test@example-client.com"
|
104
106
|
fill_in "Passphrase", :with => "q1w2e3r4t5y6u7i8o9p0"
|
105
107
|
click_on "Sign in"
|
106
108
|
|
107
109
|
# then back again to the restricted page
|
108
|
-
page.
|
110
|
+
expect(page).to have_content('restricted kablooie')
|
109
111
|
end
|
110
112
|
end
|
111
113
|
|
112
114
|
describe "session expiry" do
|
113
115
|
it "should force you to re-authenticate with signonotron N hours after login" do
|
114
116
|
visit "http://#{@client_host}/restricted"
|
115
|
-
page.
|
117
|
+
expect(page).to have_content("Sign in")
|
116
118
|
fill_in "Email", :with => "test@example-client.com"
|
117
119
|
fill_in "Passphrase", :with => "q1w2e3r4t5y6u7i8o9p0"
|
118
120
|
click_on "Sign in"
|
119
121
|
|
120
|
-
page.
|
122
|
+
expect(page).to have_content('restricted kablooie')
|
121
123
|
|
122
124
|
Timecop.travel(Time.now.utc + GDS::SSO::Config.auth_valid_for + 5.minutes) do
|
123
125
|
visit "http://#{@client_host}/restricted"
|
124
126
|
end
|
125
127
|
|
126
|
-
page.driver.request.referrer.
|
128
|
+
expect(page.driver.request.referrer).to match(%r(\Ahttp://#{@client_host}/auth/gds/callback))
|
127
129
|
end
|
128
130
|
|
129
131
|
|
130
132
|
it "should not require re-authentication with signonotron fewer than N hours after login" do
|
131
133
|
visit "http://#{@client_host}/restricted"
|
132
|
-
page.
|
134
|
+
expect(page).to have_content("Sign in")
|
133
135
|
fill_in "Email", :with => "test@example-client.com"
|
134
136
|
fill_in "Passphrase", :with => "q1w2e3r4t5y6u7i8o9p0"
|
135
137
|
click_on "Sign in"
|
136
138
|
|
137
|
-
page.
|
139
|
+
expect(page).to have_content('restricted kablooie')
|
138
140
|
|
139
141
|
Timecop.travel(Time.now.utc + GDS::SSO::Config.auth_valid_for - 5.minutes) do
|
140
142
|
visit "http://#{@client_host}/restricted"
|
141
143
|
end
|
142
144
|
|
143
|
-
page.driver.request.referrer.
|
145
|
+
expect(page.driver.request.referrer).to match(%r(\Ahttp://#{@client_host}/restricted))
|
144
146
|
end
|
145
147
|
end
|
146
148
|
end
|
@@ -157,17 +159,17 @@ describe "Integration of client using GDS-SSO with signonotron" do
|
|
157
159
|
specify "access to a restricted page for an api client requires auth" do
|
158
160
|
page.driver.header 'authorization', 'Bearer Bad Token'
|
159
161
|
visit "http://#{@client_host}/restricted"
|
160
|
-
page.driver.response.status.
|
162
|
+
expect(page.driver.response.status).to eq(401)
|
161
163
|
end
|
162
164
|
|
163
165
|
specify "setting a correct bearer token allows sign in" do
|
164
166
|
visit "http://#{@client_host}/restricted"
|
165
|
-
page.
|
167
|
+
expect(page).to have_content('restricted kablooie')
|
166
168
|
end
|
167
169
|
|
168
170
|
specify "setting a correct bearer token picks up permissions" do
|
169
171
|
visit "http://#{@client_host}/this_requires_signin_permission"
|
170
|
-
page.
|
172
|
+
expect(page).to have_content('you have signin permission')
|
171
173
|
end
|
172
174
|
end
|
173
175
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -21,7 +21,15 @@ require 'capybara/mechanize'
|
|
21
21
|
include Warden::Test::Helpers
|
22
22
|
|
23
23
|
RSpec.configure do |config|
|
24
|
-
config.
|
24
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
25
|
+
config.run_all_when_everything_filtered = true
|
26
|
+
config.filter_run :focus
|
27
|
+
|
28
|
+
# Run specs in random order to surface order dependencies. If you find an
|
29
|
+
# order dependency and want to debug it, you can fix the order by providing
|
30
|
+
# the seed, which is printed after each run.
|
31
|
+
# --seed 1234
|
32
|
+
config.order = 'random'
|
25
33
|
end
|
26
34
|
|
27
35
|
Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each {|f| require f}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'gds-sso/api_access'
|
3
|
+
|
4
|
+
describe GDS::SSO::ApiAccess do
|
5
|
+
it "should not consider IE7 accept header as an api call" do
|
6
|
+
ie7_accept_header = 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, ' +
|
7
|
+
'application/x-shockwave-flash, application/xaml+xml, application/x-ms-xbap, ' +
|
8
|
+
'application/x-ms-application, */*'
|
9
|
+
expect(GDS::SSO::ApiAccess.api_call?('HTTP_ACCEPT' => ie7_accept_header)).to be_false
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should consider a json accept header to be an api call" do
|
13
|
+
expect(GDS::SSO::ApiAccess.api_call?('HTTP_ACCEPT' => 'application/json')).to be_true
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should consider a request with an authorization header to be an oauth api call" do
|
17
|
+
expect(GDS::SSO::ApiAccess.oauth_api_call?('HTTP_AUTHORIZATION' => 'Bearer blahblahblah')).to be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should not consider a request with HTTP basic auth to be an oauth api call" do
|
21
|
+
expect(GDS::SSO::ApiAccess.oauth_api_call?('HTTP_AUTHORIZATION' => 'Basic Some basic credentials')).to be_false
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should not consider a request with an empty authorization header to be an oauth api call" do
|
25
|
+
expect(GDS::SSO::ApiAccess.oauth_api_call?('HTTP_AUTHORIZATION' => '')).to be_false
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'active_record'
|
3
|
+
|
4
|
+
describe Warden::SessionSerializer do
|
5
|
+
class User < ActiveRecord::Base
|
6
|
+
include GDS::SSO::User
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
before :each do
|
11
|
+
@old_user_model = GDS::SSO::Config.user_model
|
12
|
+
GDS::SSO::Config.user_model = User
|
13
|
+
@user = double("User", uid: 1234)
|
14
|
+
@serializer = Warden::SessionSerializer.new(nil)
|
15
|
+
end
|
16
|
+
after :each do
|
17
|
+
GDS::SSO::Config.user_model = @old_user_model
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "serializing a user" do
|
21
|
+
|
22
|
+
it "should return the uid and a timestamp" do
|
23
|
+
Timecop.freeze
|
24
|
+
result = @serializer.serialize(@user)
|
25
|
+
|
26
|
+
expect(result).to eq([1234, Time.now.utc])
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should return nil if the user has no uid" do
|
30
|
+
@user.stub(:uid).and_return(nil)
|
31
|
+
result = @serializer.serialize(@user)
|
32
|
+
|
33
|
+
expect(result).to be_nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "deserialize a user" do
|
38
|
+
it "should return the user if the timestamp is current" do
|
39
|
+
expect(User).to receive(:where).with(:uid => 1234, :remotely_signed_out => false).and_return(double(:first => :a_user))
|
40
|
+
|
41
|
+
result = @serializer.deserialize [1234, Time.now.utc - GDS::SSO::Config.auth_valid_for + 3600]
|
42
|
+
|
43
|
+
expect(result).to equal(:a_user)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return nil if the timestamp is out of date" do
|
47
|
+
expect(User).not_to receive(:where)
|
48
|
+
|
49
|
+
result = @serializer.deserialize [1234, Time.now.utc - GDS::SSO::Config.auth_valid_for - 3600]
|
50
|
+
|
51
|
+
expect(result).to be_nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should return nil for a user without a timestamp" do
|
55
|
+
expect(User).not_to receive(:where)
|
56
|
+
|
57
|
+
result = @serializer.deserialize 1234
|
58
|
+
|
59
|
+
expect(result).to be_nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
require 'gds-sso/user'
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
describe GDS::SSO::User do
|
5
|
+
before :each do
|
6
6
|
@auth_hash = {
|
7
7
|
'provider' => 'gds',
|
8
8
|
'uid' => 'abcde',
|
@@ -12,8 +12,8 @@ class TestUser < Test::Unit::TestCase
|
|
12
12
|
}
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
it "should extract the user params from the oauth hash" do
|
16
16
|
expected = {'uid' => 'abcde', 'name' => 'Matt Patterson', 'email' => 'matt@alphagov.co.uk', "permissions" => [], "organisation_slug" => nil}
|
17
|
-
|
17
|
+
expect(GDS::SSO::User.user_params_from_auth_hash(@auth_hash)).to eq(expected)
|
18
18
|
end
|
19
19
|
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: 9.2.
|
4
|
+
version: 9.2.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-02-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
@@ -92,22 +92,6 @@ dependencies:
|
|
92
92
|
- - '='
|
93
93
|
- !ruby/object:Gem::Version
|
94
94
|
version: 0.9.2.2
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
name: mocha
|
97
|
-
requirement: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
|
-
requirements:
|
100
|
-
- - '='
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: 0.13.3
|
103
|
-
type: :development
|
104
|
-
prerelease: false
|
105
|
-
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
|
-
requirements:
|
108
|
-
- - '='
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: 0.13.3
|
111
95
|
- !ruby/object:Gem::Dependency
|
112
96
|
name: capybara
|
113
97
|
requirement: !ruby/object:Gem::Requirement
|
@@ -131,7 +115,7 @@ dependencies:
|
|
131
115
|
requirements:
|
132
116
|
- - '='
|
133
117
|
- !ruby/object:Gem::Version
|
134
|
-
version: 2.
|
118
|
+
version: 2.14.1
|
135
119
|
type: :development
|
136
120
|
prerelease: false
|
137
121
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -139,7 +123,7 @@ dependencies:
|
|
139
123
|
requirements:
|
140
124
|
- - '='
|
141
125
|
- !ruby/object:Gem::Version
|
142
|
-
version: 2.
|
126
|
+
version: 2.14.1
|
143
127
|
- !ruby/object:Gem::Dependency
|
144
128
|
name: capybara-mechanize
|
145
129
|
requirement: !ruby/object:Gem::Requirement
|
@@ -294,12 +278,11 @@ files:
|
|
294
278
|
- README.md
|
295
279
|
- Gemfile
|
296
280
|
- Rakefile
|
297
|
-
-
|
298
|
-
-
|
299
|
-
-
|
300
|
-
-
|
281
|
+
- spec/unit/session_serialisation_spec.rb
|
282
|
+
- spec/unit/user_spec.rb
|
283
|
+
- spec/unit/api_access_spec.rb
|
284
|
+
- spec/support/timecop.rb
|
301
285
|
- spec/support/signonotron2_integration_helpers.rb
|
302
|
-
- spec/requests/authentication_soot2.rb
|
303
286
|
- spec/requests/end_to_end_spec.rb
|
304
287
|
- spec/spec_helper.rb
|
305
288
|
- spec/controller/api_user_controller_spec.rb
|
@@ -332,7 +315,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
332
315
|
version: '0'
|
333
316
|
segments:
|
334
317
|
- 0
|
335
|
-
hash:
|
318
|
+
hash: 426318311748726962
|
336
319
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
337
320
|
none: false
|
338
321
|
requirements:
|
@@ -341,7 +324,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
341
324
|
version: '0'
|
342
325
|
segments:
|
343
326
|
- 0
|
344
|
-
hash:
|
327
|
+
hash: 426318311748726962
|
345
328
|
requirements: []
|
346
329
|
rubyforge_project: gds-sso
|
347
330
|
rubygems_version: 1.8.23
|
@@ -349,12 +332,11 @@ signing_key:
|
|
349
332
|
specification_version: 3
|
350
333
|
summary: Client for GDS' OAuth 2-based SSO
|
351
334
|
test_files:
|
352
|
-
-
|
353
|
-
-
|
354
|
-
-
|
355
|
-
-
|
335
|
+
- spec/unit/session_serialisation_spec.rb
|
336
|
+
- spec/unit/user_spec.rb
|
337
|
+
- spec/unit/api_access_spec.rb
|
338
|
+
- spec/support/timecop.rb
|
356
339
|
- spec/support/signonotron2_integration_helpers.rb
|
357
|
-
- spec/requests/authentication_soot2.rb
|
358
340
|
- spec/requests/end_to_end_spec.rb
|
359
341
|
- spec/spec_helper.rb
|
360
342
|
- spec/controller/api_user_controller_spec.rb
|
@@ -1,116 +0,0 @@
|
|
1
|
-
require_relative '../spec_helper'
|
2
|
-
|
3
|
-
include Rack::Test
|
4
|
-
|
5
|
-
describe "authenticating with sign-on-o-tron" do
|
6
|
-
|
7
|
-
describe "when not signed in" do
|
8
|
-
|
9
|
-
describe "a protected page" do
|
10
|
-
it "redirects to /auth/gds" do
|
11
|
-
get "/restricted"
|
12
|
-
|
13
|
-
response.code.should == "302"
|
14
|
-
response.location.should == "http://www.example.com/auth/gds"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe "/auth/gds" do
|
19
|
-
it "redirects to signonotron2" do
|
20
|
-
get "/auth/gds"
|
21
|
-
|
22
|
-
response.code.should == "302"
|
23
|
-
response.location.should =~ /^http:\/\/localhost:4567\/oauth\/authorize/
|
24
|
-
end
|
25
|
-
|
26
|
-
it "authenticates with a username and password and redirects back to the app" do
|
27
|
-
get "/auth/gds"
|
28
|
-
|
29
|
-
uri = URI.parse(response.location)
|
30
|
-
auth_path = uri.path + '?' + uri.query
|
31
|
-
|
32
|
-
client_cookies = response.headers['Set-Cookie'].split('; ')[0]
|
33
|
-
|
34
|
-
@signonotron = Faraday.new(:url => "#{uri.scheme}://#{uri.host}:#{uri.port}") do |builder|
|
35
|
-
builder.request :url_encoded
|
36
|
-
builder.adapter :net_http
|
37
|
-
end
|
38
|
-
|
39
|
-
authz_return_location = do_auth_request(auth_path)
|
40
|
-
|
41
|
-
return_path = authz_return_location.path + '?' + (authz_return_location.query || '')
|
42
|
-
|
43
|
-
get return_path, { }, { 'Cookie' => client_cookies }
|
44
|
-
|
45
|
-
puts "HANDLE AUTH RESULT\n====================\n"
|
46
|
-
puts response.headers
|
47
|
-
|
48
|
-
# resp = Net::HTTP.get_response( URI::parse(response.location) )
|
49
|
-
# location = resp["location"]
|
50
|
-
|
51
|
-
# visit location
|
52
|
-
# puts page.current_uri
|
53
|
-
|
54
|
-
# fill_in "user_email", :with => "foo@example.com"
|
55
|
-
# fill_in "user_password", :with => "this is an example for the test"
|
56
|
-
# click_button "Sign in"
|
57
|
-
end
|
58
|
-
|
59
|
-
def do_auth_request(auth_path)
|
60
|
-
auth_request = @signonotron.get(auth_path)
|
61
|
-
|
62
|
-
debug_request('Auth Request', 'GET', auth_path, auth_request, '')
|
63
|
-
|
64
|
-
sign_in_location = URI.parse(auth_request.headers['location']).path
|
65
|
-
cookie = auth_request.headers['Set-Cookie'].split('; ')[0]
|
66
|
-
|
67
|
-
return do_sign_in_request(sign_in_location, cookie)
|
68
|
-
end
|
69
|
-
|
70
|
-
def do_sign_in_request(sign_in_location, cookie)
|
71
|
-
sign_in_request = @signonotron.get do |req|
|
72
|
-
req.url sign_in_location
|
73
|
-
req.headers['Cookie'] = cookie
|
74
|
-
end
|
75
|
-
|
76
|
-
debug_request('Sign In', 'GET', sign_in_location, sign_in_request, cookie)
|
77
|
-
|
78
|
-
cookie = sign_in_request.headers['Set-Cookie'].split('; ')[0]
|
79
|
-
sign_in_location = Nokogiri.parse(sign_in_request.body).xpath("//form").first.attributes['action'].text
|
80
|
-
authenticity_token = Nokogiri.parse(sign_in_request.body).xpath("//input[@name='authenticity_token']").first.attributes['value'].text
|
81
|
-
|
82
|
-
return do_sign_in_post(sign_in_location, cookie, authenticity_token)
|
83
|
-
end
|
84
|
-
|
85
|
-
def do_sign_in_post(sign_in_location, cookie, authenticity_token)
|
86
|
-
|
87
|
-
sign_in_post = @signonotron.post do |req|
|
88
|
-
req.url sign_in_location
|
89
|
-
req.body = { :user => { :email => 'foo@example.com', :password => 'this is an example for the test' }, :authenticity_token => authenticity_token }
|
90
|
-
req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
91
|
-
req.headers['Cookie'] = cookie
|
92
|
-
end
|
93
|
-
|
94
|
-
debug_request('Sign In', 'POST', sign_in_location, sign_in_post, cookie)
|
95
|
-
|
96
|
-
cookie = sign_in_post.headers['Set-Cookie'].split('; ')[0]
|
97
|
-
authz_location = URI.parse(sign_in_post.headers['location'])
|
98
|
-
|
99
|
-
return authz_location
|
100
|
-
end
|
101
|
-
|
102
|
-
def debug_request(name, method, path, response, cookie)
|
103
|
-
puts "#{name} REQUEST RESULT:\n=========================\n"
|
104
|
-
puts "#{method} #{path}"
|
105
|
-
puts "#{cookie}"
|
106
|
-
|
107
|
-
puts "\n\n"
|
108
|
-
|
109
|
-
puts response.headers.inspect
|
110
|
-
puts response.body
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
end
|
115
|
-
|
116
|
-
end
|