omniauth-hackid 0.0.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,109 @@
1
+ module SignedRequestHelpers
2
+ def signed_request(payload, secret)
3
+ encoded_payload = base64_encode_url(MultiJson.encode(payload))
4
+ encoded_signature = base64_encode_url(signature(encoded_payload, secret))
5
+ [encoded_signature, encoded_payload].join('.')
6
+ end
7
+
8
+ def base64_encode_url(value)
9
+ Base64.encode64(value).tr('+/', '-_').gsub(/\n/, '')
10
+ end
11
+
12
+ def signature(payload, secret, algorithm = OpenSSL::Digest::SHA256.new)
13
+ OpenSSL::HMAC.digest(algorithm, secret, payload)
14
+ end
15
+ end
16
+
17
+ module SignedRequestTests
18
+ class TestCase < StrategyTestCase
19
+ include SignedRequestHelpers
20
+ end
21
+
22
+ class CookieAndParamNotPresentTest < TestCase
23
+ test 'is nil' do
24
+ assert_nil strategy.send(:signed_request)
25
+ end
26
+ end
27
+
28
+ class CookiePresentTest < TestCase
29
+ def setup
30
+ super
31
+ @payload = {
32
+ 'algorithm' => 'HMAC-SHA256',
33
+ 'code' => 'm4c0d3z',
34
+ 'issued_at' => Time.now.to_i,
35
+ 'user_id' => '123456'
36
+ }
37
+
38
+ @request.stubs(:cookies).returns({"fbsr_#{@client_id}" => signed_request(@payload, @client_secret)})
39
+ end
40
+
41
+ test 'parses the access code out from the cookie' do
42
+ assert_equal @payload, strategy.send(:signed_request)
43
+ end
44
+ end
45
+
46
+ class ParamPresentTest < TestCase
47
+ def setup
48
+ super
49
+ @payload = {
50
+ 'algorithm' => 'HMAC-SHA256',
51
+ 'oauth_token' => 'XXX',
52
+ 'issued_at' => Time.now.to_i,
53
+ 'user_id' => '123456'
54
+ }
55
+
56
+ @request.stubs(:params).returns({'signed_request' => signed_request(@payload, @client_secret)})
57
+ end
58
+
59
+ test 'parses the access code out from the param' do
60
+ assert_equal @payload, strategy.send(:signed_request)
61
+ end
62
+ end
63
+
64
+ class CookieAndParamPresentTest < TestCase
65
+ def setup
66
+ super
67
+ @payload_from_cookie = {
68
+ 'algorithm' => 'HMAC-SHA256',
69
+ 'from' => 'cookie'
70
+ }
71
+
72
+ @request.stubs(:cookies).returns({"fbsr_#{@client_id}" => signed_request(@payload_from_cookie, @client_secret)})
73
+
74
+ @payload_from_param = {
75
+ 'algorithm' => 'HMAC-SHA256',
76
+ 'from' => 'param'
77
+ }
78
+
79
+ @request.stubs(:params).returns({'signed_request' => signed_request(@payload_from_param, @client_secret)})
80
+ end
81
+
82
+ test 'picks param over cookie' do
83
+ assert_equal @payload_from_param, strategy.send(:signed_request)
84
+ end
85
+ end
86
+ end
87
+
88
+ class RequestPhaseWithSignedRequestTest < StrategyTestCase
89
+ include SignedRequestHelpers
90
+
91
+ def setup
92
+ super
93
+
94
+ payload = {
95
+ 'algorithm' => 'HMAC-SHA256',
96
+ 'oauth_token' => 'm4c0d3z'
97
+ }
98
+ @raw_signed_request = signed_request(payload, @client_secret)
99
+ @request.stubs(:params).returns("signed_request" => @raw_signed_request)
100
+
101
+ strategy.stubs(:callback_url).returns('/')
102
+ end
103
+
104
+ test 'redirects to callback passing along signed request' do
105
+ strategy.expects(:redirect).with("/?signed_request=#{Rack::Utils.escape(@raw_signed_request)}").once
106
+ strategy.request_phase
107
+ end
108
+ end
109
+
@@ -0,0 +1,3 @@
1
+ class StrategyTest < StrategyTestCase
2
+ include OAuth2StrategyTests
3
+ end
@@ -0,0 +1,85 @@
1
+ # NOTE it would be useful if this lived in omniauth-oauth2 eventually
2
+ module OAuth2StrategyTests
3
+ def self.included(base)
4
+ base.class_eval do
5
+ include ClientTests
6
+ include AuthorizeParamsTests
7
+ include CSRFAuthorizeParamsTests
8
+ include TokenParamsTests
9
+ end
10
+ end
11
+
12
+ module ClientTests
13
+ extend BlockTestHelper
14
+
15
+ test 'should be initialized with symbolized client_options' do
16
+ @options = { :client_options => { 'authorize_url' => 'https://example.com' } }
17
+ assert_equal 'https://example.com', strategy.client.options[:authorize_url]
18
+ end
19
+ end
20
+
21
+ module AuthorizeParamsTests
22
+ extend BlockTestHelper
23
+
24
+ test 'should include any authorize params passed in the :authorize_params option' do
25
+ @options = { :authorize_params => { :foo => 'bar', :baz => 'zip' } }
26
+ assert_equal 'bar', strategy.authorize_params['foo']
27
+ assert_equal 'zip', strategy.authorize_params['baz']
28
+ end
29
+
30
+ test 'should include top-level options that are marked as :authorize_options' do
31
+ @options = { :authorize_options => [:scope, :foo], :scope => 'bar', :foo => 'baz' }
32
+ assert_equal 'bar', strategy.authorize_params['scope']
33
+ assert_equal 'baz', strategy.authorize_params['foo']
34
+ end
35
+
36
+ test 'should exclude top-level options that are not passed' do
37
+ @options = { :authorize_options => [:bar] }
38
+ refute_has_key :bar, strategy.authorize_params
39
+ refute_has_key 'bar', strategy.authorize_params
40
+ end
41
+ end
42
+
43
+ module CSRFAuthorizeParamsTests
44
+ extend BlockTestHelper
45
+
46
+ test 'should store random state in the session when none is present in authorize or request params' do
47
+ assert_includes strategy.authorize_params.keys, 'state'
48
+ refute_empty strategy.authorize_params['state']
49
+ refute_empty strategy.session['omniauth.state']
50
+ assert_equal strategy.authorize_params['state'], strategy.session['omniauth.state']
51
+ end
52
+
53
+ test 'should store state in the session when present in authorize params vs. a random one' do
54
+ @options = { :authorize_params => { :state => 'bar' } }
55
+ refute_empty strategy.authorize_params['state']
56
+ assert_equal 'bar', strategy.authorize_params[:state]
57
+ refute_empty strategy.session['omniauth.state']
58
+ assert_equal 'bar', strategy.session['omniauth.state']
59
+ end
60
+
61
+ test 'should store state in the session when present in request params vs. a random one' do
62
+ @request.stubs(:params).returns({ 'state' => 'foo' })
63
+ refute_empty strategy.authorize_params['state']
64
+ assert_equal 'foo', strategy.authorize_params[:state]
65
+ refute_empty strategy.session['omniauth.state']
66
+ assert_equal 'foo', strategy.session['omniauth.state']
67
+ end
68
+ end
69
+
70
+ module TokenParamsTests
71
+ extend BlockTestHelper
72
+
73
+ test 'should include any authorize params passed in the :token_params option' do
74
+ @options = { :token_params => { :foo => 'bar', :baz => 'zip' } }
75
+ assert_equal 'bar', strategy.token_params['foo']
76
+ assert_equal 'zip', strategy.token_params['baz']
77
+ end
78
+
79
+ test 'should include top-level options that are marked as :token_options' do
80
+ @options = { :token_options => [:scope, :foo], :scope => 'bar', :foo => 'baz' }
81
+ assert_equal 'bar', strategy.token_params['scope']
82
+ assert_equal 'baz', strategy.token_params['foo']
83
+ end
84
+ end
85
+ end
data/test/test.rb ADDED
@@ -0,0 +1,162 @@
1
+ require 'helper'
2
+ require 'omniauth-hackid'
3
+ require 'openssl'
4
+ require 'base64'
5
+
6
+ module SignedRequestHelpers
7
+ def signed_request(payload, secret)
8
+ encoded_payload = base64_encode_url(MultiJson.encode(payload))
9
+ encoded_signature = base64_encode_url(signature(encoded_payload, secret))
10
+ [encoded_signature, encoded_payload].join('.')
11
+ end
12
+
13
+ def base64_encode_url(value)
14
+ Base64.encode64(value).tr('+/', '-_').gsub(/\n/, '')
15
+ end
16
+
17
+ def signature(payload, secret, algorithm = OpenSSL::Digest::SHA256.new)
18
+ OpenSSL::HMAC.digest(algorithm, secret, payload)
19
+ end
20
+ end
21
+
22
+ module SignedRequestTests
23
+ class TestCase < StrategyTestCase
24
+ include SignedRequestHelpers
25
+ end
26
+
27
+ class CookieAndParamNotPresentTest < TestCase
28
+ test 'is nil' do
29
+ assert_nil strategy.send(:signed_request)
30
+ end
31
+ end
32
+
33
+ class CookiePresentTest < TestCase
34
+ def setup
35
+ super
36
+ @payload = {
37
+ 'algorithm' => 'HMAC-SHA256',
38
+ 'code' => 'm4c0d3z',
39
+ 'issued_at' => Time.now.to_i,
40
+ 'user_id' => '123456'
41
+ }
42
+
43
+ @request.stubs(:cookies).returns({"fbsr_#{@client_id}" => signed_request(@payload, @client_secret)})
44
+ end
45
+
46
+ test 'parses the access code out from the cookie' do
47
+ assert_equal @payload, strategy.send(:signed_request)
48
+ end
49
+ end
50
+
51
+ class ParamPresentTest < TestCase
52
+ def setup
53
+ super
54
+ @payload = {
55
+ 'algorithm' => 'HMAC-SHA256',
56
+ 'oauth_token' => 'XXX',
57
+ 'issued_at' => Time.now.to_i,
58
+ 'user_id' => '123456'
59
+ }
60
+
61
+ @request.stubs(:params).returns({'signed_request' => signed_request(@payload, @client_secret)})
62
+ end
63
+
64
+ test 'parses the access code out from the param' do
65
+ assert_equal @payload, strategy.send(:signed_request)
66
+ end
67
+ end
68
+
69
+ class CookieAndParamPresentTest < TestCase
70
+ def setup
71
+ super
72
+ @payload_from_cookie = {
73
+ 'algorithm' => 'HMAC-SHA256',
74
+ 'from' => 'cookie'
75
+ }
76
+
77
+ @request.stubs(:cookies).returns({"fbsr_#{@client_id}" => signed_request(@payload_from_cookie, @client_secret)})
78
+
79
+ @payload_from_param = {
80
+ 'algorithm' => 'HMAC-SHA256',
81
+ 'from' => 'param'
82
+ }
83
+
84
+ @request.stubs(:params).returns({'signed_request' => signed_request(@payload_from_param, @client_secret)})
85
+ end
86
+
87
+ test 'picks param over cookie' do
88
+ assert_equal @payload_from_param, strategy.send(:signed_request)
89
+ end
90
+ end
91
+ end
92
+
93
+ class RequestPhaseWithSignedRequestTest < StrategyTestCase
94
+ include SignedRequestHelpers
95
+
96
+ def setup
97
+ super
98
+
99
+ payload = {
100
+ 'algorithm' => 'HMAC-SHA256',
101
+ 'oauth_token' => 'm4c0d3z'
102
+ }
103
+ @raw_signed_request = signed_request(payload, @client_secret)
104
+ @request.stubs(:params).returns("signed_request" => @raw_signed_request)
105
+
106
+ strategy.stubs(:callback_url).returns('/')
107
+ end
108
+
109
+ test 'redirects to callback passing along signed request' do
110
+ strategy.expects(:redirect).with("/?signed_request=#{Rack::Utils.escape(@raw_signed_request)}").once
111
+ strategy.request_phase
112
+ end
113
+ end
114
+
115
+ module BuildAccessTokenTests
116
+ class TestCase < StrategyTestCase
117
+ include SignedRequestHelpers
118
+ end
119
+
120
+ class ParamsContainSignedRequestWithAccessTokenTest < TestCase
121
+ def setup
122
+ super
123
+
124
+ @payload = {
125
+ 'algorithm' => 'HMAC-SHA256',
126
+ 'oauth_token' => 'm4c0d3z',
127
+ 'expires' => Time.now.to_i
128
+ }
129
+ @raw_signed_request = signed_request(@payload, @client_secret)
130
+ @request.stubs(:params).returns({"signed_request" => @raw_signed_request})
131
+
132
+ strategy.stubs(:callback_url).returns('/')
133
+ end
134
+
135
+ test 'returns a new access token from the signed request' do
136
+ result = strategy.build_access_token
137
+ assert_kind_of ::OAuth2::AccessToken, result
138
+ assert_equal @payload['oauth_token'], result.token
139
+ end
140
+
141
+ test 'returns an access token with the correct expiry time' do
142
+ result = strategy.build_access_token
143
+ assert_equal @payload['expires'], result.expires_at
144
+ end
145
+ end
146
+
147
+ class ParamsContainAccessTokenStringTest < TestCase
148
+ def setup
149
+ super
150
+
151
+ @request.stubs(:params).returns({'access_token' => 'm4c0d3z'})
152
+
153
+ strategy.stubs(:callback_url).returns('/')
154
+ end
155
+
156
+ test 'returns a new access token' do
157
+ result = strategy.build_access_token
158
+ assert_kind_of ::OAuth2::AccessToken, result
159
+ assert_equal 'm4c0d3z', result.token
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,5 @@
1
+ class TokenParamsTest < StrategyTestCase
2
+ test 'has correct parse strategy' do
3
+ assert_equal :query, strategy.token_params[:parse]
4
+ end
5
+ end
data/test/uid_test.rb ADDED
@@ -0,0 +1,10 @@
1
+ class UidTest < StrategyTestCase
2
+ def setup
3
+ super
4
+ strategy.stubs(:raw_info).returns({ 'id' => '123' })
5
+ end
6
+
7
+ test 'returns the id from raw_info' do
8
+ assert_equal '123', strategy.uid
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniauth-hackid
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Steve Yadlowsky
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: omniauth-oauth2
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.1'
30
+ - !ruby/object:Gem::Dependency
31
+ name: minitest
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: mocha
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description:
79
+ email:
80
+ - grizlo42@gmail.com
81
+ executables: []
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - .gitignore
86
+ - .travis.yml
87
+ - Gemfile
88
+ - README.md
89
+ - Rakefile
90
+ - example/Gemfile
91
+ - example/Gemfile.lock
92
+ - example/config.ru
93
+ - lib/omniauth-hackid.rb
94
+ - lib/omniauth/hackid.rb
95
+ - lib/omniauth/hackid/version.rb
96
+ - lib/omniauth/strategies/hackid.rb
97
+ - omniauth-hackid.gemspec
98
+ - test/access_token_options_test.rb
99
+ - test/authorize_params_test.rb
100
+ - test/build_access_token_test.rb
101
+ - test/callback_url_test.rb
102
+ - test/client_test.rb
103
+ - test/credentials_test.rb
104
+ - test/extra_test.rb
105
+ - test/helper.rb
106
+ - test/info_test.rb
107
+ - test/raw_info_test.rb
108
+ - test/signed_request_test.rb
109
+ - test/strategy_test.rb
110
+ - test/support/shared_examples.rb
111
+ - test/test.rb
112
+ - test/token_params_test.rb
113
+ - test/uid_test.rb
114
+ homepage: https://github.com/grizlo42/omniauth-hackid
115
+ licenses: []
116
+ post_install_message:
117
+ rdoc_options: []
118
+ require_paths:
119
+ - lib
120
+ required_ruby_version: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 1.8.24
135
+ signing_key:
136
+ specification_version: 3
137
+ summary: HackID strategy for OmniAuth
138
+ test_files: []