json-jwt 0.0.0 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of json-jwt might be problematic. Click here for more details.
- data/.travis.yml +1 -2
- data/Gemfile.lock +33 -0
- data/VERSION +1 -1
- data/lib/json/jws.rb +2 -2
- data/lib/json/jwt.rb +4 -4
- data/spec/fixtures/rsa/private_key.pem +30 -0
- data/spec/fixtures/rsa/public_key.pem +8 -0
- data/spec/helpers/sign_key_fixture_helper.rb +30 -0
- data/spec/json/jws_spec.rb +74 -0
- data/spec/json/jwt_spec.rb +40 -0
- data/spec/spec_helper.rb +3 -1
- metadata +44 -3
data/.travis.yml
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
json-jwt (0.0.0)
|
5
|
+
json (>= 1.4.3)
|
6
|
+
url_safe_base64
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
diff-lcs (1.1.3)
|
12
|
+
json (1.6.0)
|
13
|
+
rake (0.9.2)
|
14
|
+
rcov (0.9.10)
|
15
|
+
rspec (2.6.0)
|
16
|
+
rspec-core (~> 2.6.0)
|
17
|
+
rspec-expectations (~> 2.6.0)
|
18
|
+
rspec-mocks (~> 2.6.0)
|
19
|
+
rspec-core (2.6.4)
|
20
|
+
rspec-expectations (2.6.0)
|
21
|
+
diff-lcs (~> 1.1.2)
|
22
|
+
rspec-mocks (2.6.0)
|
23
|
+
url_safe_base64 (0.2.1)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
ruby
|
27
|
+
|
28
|
+
DEPENDENCIES
|
29
|
+
jruby-openssl (>= 0.7)
|
30
|
+
json-jwt!
|
31
|
+
rake (>= 0.8)
|
32
|
+
rcov (>= 0.9)
|
33
|
+
rspec (>= 2)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.1
|
data/lib/json/jws.rb
CHANGED
@@ -2,7 +2,7 @@ module JSON
|
|
2
2
|
class JWS < JWT
|
3
3
|
def initialize(jwt)
|
4
4
|
@header = jwt.header
|
5
|
-
|
5
|
+
replace jwt
|
6
6
|
end
|
7
7
|
|
8
8
|
def sign(private_key_or_secret, algorithm)
|
@@ -33,7 +33,7 @@ module JSON
|
|
33
33
|
def signature_base_string
|
34
34
|
[
|
35
35
|
header.to_json,
|
36
|
-
|
36
|
+
self.to_json
|
37
37
|
].collect do |segment|
|
38
38
|
UrlSafeBase64.encode64 segment
|
39
39
|
end.join('.')
|
data/lib/json/jwt.rb
CHANGED
@@ -3,8 +3,8 @@ require 'url_safe_base64'
|
|
3
3
|
require 'json'
|
4
4
|
|
5
5
|
module JSON
|
6
|
-
class JWT
|
7
|
-
attr_accessor :header, :
|
6
|
+
class JWT < Hash
|
7
|
+
attr_accessor :header, :signature
|
8
8
|
|
9
9
|
def initialize(claim)
|
10
10
|
@header = {
|
@@ -16,7 +16,7 @@ module JSON
|
|
16
16
|
claim[key] = claim[key].to_i
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
19
|
+
replace claim
|
20
20
|
end
|
21
21
|
|
22
22
|
def sign(private_key_or_secret, algorithm = :RS256)
|
@@ -26,7 +26,7 @@ module JSON
|
|
26
26
|
def to_s
|
27
27
|
[
|
28
28
|
header.to_json,
|
29
|
-
|
29
|
+
self.to_json,
|
30
30
|
signature
|
31
31
|
].collect do |segment|
|
32
32
|
UrlSafeBase64.encode64 segment.to_s
|
@@ -0,0 +1,30 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
Proc-Type: 4,ENCRYPTED
|
3
|
+
DEK-Info: AES-256-CBC,A6B5D10FFA23D7BC66CE4FB46B754E8C
|
4
|
+
|
5
|
+
gvYFJmzetWSwpf1Ut6USm4IReFLA6bpp5nVUfU2Xa9dJmrCu0cTupTkdzNmGp14/
|
6
|
+
mzeT/a5WplK1hWV41Y7bLm57hOpaoxbEx2h3IW9cxuqgAp422AbafRu6hEvjUONO
|
7
|
+
qUEm63I4d7/FKo0he4IVVx0UHaX5eEq8pdY1AZR9+fqlxWvjpgZlB0anT3AMpfVL
|
8
|
+
CY4sGc/Es14M9A4zUpOkp+09PbV3WNG8A4G4IJA3wx6tYBxrd2866Te2ccP6/BL8
|
9
|
+
HA2uoqeD+70ziybvd//CtGAD1xoTDvOCwzXXT5A4fCuec3apFp8O6WyJ63ao99R4
|
10
|
+
E0r6AvD4iOkLMC8K2YUSc1zFLJAkhlfhBb8qFbXOwOomazWf2Z8rDtkP1VCfB9gC
|
11
|
+
W6oYRBOyVUkbaBSBOOPBJtxjuTL/cJBvFhn6r0zdC67g0CD4cabMPd1VY92lUVbl
|
12
|
+
JvE9CouDB5O39jwfpgfxo3kGev2UzwRze9U2uw6EdYIUB/ixyC8/5BoN8lKZXdTn
|
13
|
+
7vQBmcBsC3boMqQiq2c/dVGW7yrt/Y4q8wq9aGFwdBAY1pYhRlOZ0MwFmlAJKOzo
|
14
|
+
Y3i2OILtPM0sdfqIeAvrwicQULGAzLGEhecDOQ1r0GwZRy5/Sl3ILxKMW8ngdaK4
|
15
|
+
iNDM56u6F9dwqqArrZDZgkfwnKakXU2ZbltSOWTCleCfYrc1D75Yw3FHKcWozB/l
|
16
|
+
uyMTIqzBXzO6OiNDUv7zAE1xzVaV+VeBH/5KGx18dAuRP3TnpYltGSUVDyGk9FX7
|
17
|
+
m7nhvkqOcFJMHOGdTjt2Ff9Ibn3rgCEFI0CjCwcJPo2ym1Zox8GfP0/nXk3p/oWV
|
18
|
+
ebBTvS+yc9HaSm2Al77GDXEwY7NDcTef+3kEtQHpesS+xmC8mFtMEKV8vifXEhpt
|
19
|
+
iNp6gtsfDMtFmrFXCADTaUD1WBmhJQtYUsGsoQ75c5zzUHU93BOswBe2KODCA3Ie
|
20
|
+
X3XKvHTjGw3wjWJvLcnL3EgcHDL1x7ehIA5UgvHFixmkx5D91uIdq4YDMt6xERle
|
21
|
+
JgeLKF9g1qCl9wmxqT4T1J9h9LGMQQEUhth0uTFr6bEpzgg6hFTrPDaI8dOMlcgu
|
22
|
+
ctOH2wFZgRMfrykGIs53rwF4pL+8iy+pakaRRAVTaZIX2CL2dThy0283jTVu9dNn
|
23
|
+
f/Zfu5mNlvsRcXlZMgTy0UMBpXeLMjaWyd+JeAnAeZxO3/ID/Ppg6vcc0Wn8XyB5
|
24
|
+
YUOIQe+Rc0jJnB1zqjww2cB6H5Ke3GjktQqrulHFfEYbn7lj8WLVgDLmellFNOxX
|
25
|
+
k9H2sta5SN/t3fN3oBO0A6JyotQOiBE54yHVpgoc+PBlcrpoOxSZx67lprD+WnlV
|
26
|
+
Ynnf6qIrR9NxgYN00Elzj9KP9OT1ufFrMQ0BnW4EWdFLCScGLsZVlmBKPrtHwK3N
|
27
|
+
FSy3JFMJcpymgNas5+bqIyZGqAZREHH3AWhc2TVl1Kt11g6PZWm3dSafT6SlqgyP
|
28
|
+
Z7OcBEnWr+ZhDeJfnAXrn5siah9eXuT0KtQWlqpSn76dExlfz16Da/3xBtO4ceyz
|
29
|
+
Lk4gzZ1QjP1ZvjarWOIEtkT7eiWaCQHYNVbvFRu5wo98o/KwO3xaPTDN9LCZKGhR
|
30
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,8 @@
|
|
1
|
+
-----BEGIN RSA PUBLIC KEY-----
|
2
|
+
MIIBCgKCAQEAx9vNhcvSrxjsegZAAo4OEuoZOV/oxINEeWneJYczS80/bQ1J6lSS
|
3
|
+
J81qecxXAzCLPlvsFoP4eeUNXSt/G7hP7SAM479N+kY/MzbihJ5LRY9sRzLbQTMe
|
4
|
+
qsmDAmmQe4y3Ke3bvd70r8VOmo5pqM3IPLGwBkTRTQmyRsDQArilg6WtxDUgy5ol
|
5
|
+
2STHFA8E1iCReh9bck8ZaLxzVhYRXZ0nuOKWGRMppocPlp55HVohOItUZh7uSCch
|
6
|
+
LcVAZuhTTNaDLtLIJ6G0yNJvfEieJUhA8wGBoPhD3LMQwQMxTMerpjZhP/qjm6Gg
|
7
|
+
eWpKf+iVil86/PSy/z0Vw06/rD0sfXPtlQIDAQAB
|
8
|
+
-----END RSA PUBLIC KEY-----
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module SignKeyFixtureHelper
|
2
|
+
def shared_secret
|
3
|
+
'shared-secret'
|
4
|
+
end
|
5
|
+
|
6
|
+
def pem_file(file_name)
|
7
|
+
File.new(
|
8
|
+
File.join(
|
9
|
+
File.dirname(__FILE__),
|
10
|
+
'../fixtures/rsa',
|
11
|
+
"#{file_name}.pem"
|
12
|
+
)
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def private_key
|
17
|
+
OpenSSL::PKey::RSA.new(
|
18
|
+
pem_file('private_key'),
|
19
|
+
'pass-phrase'
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
def public_key
|
24
|
+
OpenSSL::PKey::RSA.new(
|
25
|
+
pem_file('public_key')
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
include SignKeyFixtureHelper
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe JSON::JWS do
|
4
|
+
let(:jwt) { JSON::JWT.new claim }
|
5
|
+
let(:jws) { JSON::JWS.new jwt }
|
6
|
+
let(:claim) do
|
7
|
+
{
|
8
|
+
:iss => 'joe',
|
9
|
+
:exp => 1300819380,
|
10
|
+
'http://example.com/is_root' => true
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
shared_examples_for :jwt_with_alg do
|
15
|
+
it { should == jwt }
|
16
|
+
its(:header) { should == jwt.header }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'before sign' do
|
20
|
+
subject { jws }
|
21
|
+
it_behaves_like :jwt_with_alg
|
22
|
+
its(:signature) { should be_nil }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#sign' do
|
26
|
+
shared_examples_for :jwt_with_expected_signature do
|
27
|
+
it 'should generate expected signature' do
|
28
|
+
UrlSafeBase64.encode64(signed.signature).should == expected_signature[alg]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
let(:expected_signature) {
|
32
|
+
{
|
33
|
+
:HS256 => 'DyuTgO2Ggb5nrhkkhI-RjVYIBe3o8oL4ijkAn94YPxQ',
|
34
|
+
:HS384 => 'a5-7rr61TG8Snv9xxJ7l064ky-SCq1Mswe9t8HEorvoc_nnfIeUy9WQCLMIli34R',
|
35
|
+
:HS512 => 'ce-GlHDaNwaHfmAFRGp3QPPKvrpruTug2hC1bf6yNlbuvkMwJw2jFZgq_4wmIPetRdiBy7XFq7rrtmw1Im7tmQ',
|
36
|
+
:RS256 => 'E5VELqAdla2Bx1axc9KFxO0EiCr0Mw6HPYX070qGQ8zA_XmyxGPUZLyyWU_6Cn399W-oYBWO2ynLlr8pqqjP3jXevyCeYeGRVN0HzLYiBebEugNnc3hevr7WV2UzfksWRA-Ux2bDv2sz9p_LGbL33wWNxGDvIlpDyZUul_a48nCipS0riBjkTLTSE8dfBxQTXEF5GEUUu99ot6aBLzUhc25nHXSXogXF6MHK-hAcE7f4v-vJ0lbPbHLVGUopIoxoqe4XjoBpzE5UvhrVl5LYbdjbyJhu5ZIA8GLsgwtUFh3dfdIechORoR3k5NSFSv8157bAEa8t4iwgWD2MSNSQnw',
|
37
|
+
:RS384 => 'lT5JbytGKgG9QrwkJuxgw7UjmN9tjkEQW9pVGR2XnKEdC0_wLNIzAmT-jTwyMDGBLUkWO7opDOP6Xy6_DOTg58k9PwVkyQzrLnmxJMEng2Q-aMqcitRSIvUk3DPy8kemp8yUPls9NzWmByM2GoUVHbDsR0r-tZN-g_9QYev32mvMhjMr30JI5S2xiRjc9m2GAaXMOQmNTovJgV4bgCp4UjruCrA0BD1JJwDqKYoR_YYr_ALcVjD_LUgy80udJvbi8MAYJVUf0QYtQDrX2wnT_-eiiWjD5XafLuXEQVDRh-v2MKAwdvtXMq5cZ08Zjl2SyHxJ3OqhEeWPvYGltxZh_A',
|
38
|
+
:RS512 => 'EHeGM2Mo3ghhUfSB99AlREehrbC6OPE-nYL_rwf88ysTnJ8L1QQ0UuCrXq4SpRutGLK_bYTK3ZALvFRPoOgK_g0QWmqv6qjQRU_QTxoq8y8APP-IgKKDuIiGH6daBV2rAPLDReqYNKsKjmTvZJo2c0a0e_WZkkj_ZwpgjTG3v0gW9lbDAzLJDz18eqtR4ZO7JTu_fyNrUrNk-w2_wpxSsn9sygIMp0lKE0_pt0b01fz3gjTDjlltU0cKSalUp4geaBDH7QRcexrolIctdQFbNKTXQxoigxD3NLNkKGH7f6A8KZdcOm8AnEjullcZs8_OWGnW43p1qrxoBRSivb9pqQ',
|
39
|
+
:ES256 => :TODO,
|
40
|
+
:ES384 => :TODO,
|
41
|
+
:ES512 => :TODO
|
42
|
+
}
|
43
|
+
}
|
44
|
+
let(:signed) do
|
45
|
+
jws.sign key, alg
|
46
|
+
end
|
47
|
+
subject { signed }
|
48
|
+
|
49
|
+
[:HS256, :HS384, :HS512].each do |algorithm|
|
50
|
+
describe algorithm do
|
51
|
+
let(:key) { shared_secret }
|
52
|
+
let(:alg) { algorithm }
|
53
|
+
it_behaves_like :jwt_with_alg
|
54
|
+
it_behaves_like :jwt_with_expected_signature
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
[:RS256, :RS384, :RS512].each do |algorithm|
|
59
|
+
describe algorithm do
|
60
|
+
let(:key) { private_key }
|
61
|
+
let(:alg) { algorithm }
|
62
|
+
it_behaves_like :jwt_with_alg
|
63
|
+
it_behaves_like :jwt_with_expected_signature
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
[:ES256, :ES384, :ES512].each do |algorithm|
|
68
|
+
describe algorithm do
|
69
|
+
let(:alg) { algorithm }
|
70
|
+
it :TODO
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe JSON::JWT do
|
4
|
+
let(:jwt) { JSON::JWT.new claim }
|
5
|
+
let(:claim) do
|
6
|
+
{
|
7
|
+
:iss => 'joe',
|
8
|
+
:exp => 1300819380,
|
9
|
+
'http://example.com/is_root' => true
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'when no sign no encryption' do
|
14
|
+
let :result do
|
15
|
+
'eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJpc3MiOiJqb2UiLCJleHAiOjEzMDA4MTkzODAsImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.'
|
16
|
+
end
|
17
|
+
|
18
|
+
it do
|
19
|
+
jwt.to_s.should == result
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '.sign' do
|
24
|
+
[:HS256, :HS384, :HS512].each do |algorithm|
|
25
|
+
context algorithm do
|
26
|
+
it do
|
27
|
+
jwt.sign(shared_secret, algorithm).should be_a JSON::JWS
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
[:RS256, :RS384, :RS512].each do |algorithm|
|
33
|
+
context algorithm do
|
34
|
+
it do
|
35
|
+
jwt.sign(private_key, algorithm).should be_a JSON::JWS
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json-jwt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- nov matake
|
@@ -10,7 +15,7 @@ autorequire:
|
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2011-09-
|
18
|
+
date: 2011-09-15 00:00:00 Z
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: json
|
@@ -20,6 +25,11 @@ dependencies:
|
|
20
25
|
requirements:
|
21
26
|
- - ">="
|
22
27
|
- !ruby/object:Gem::Version
|
28
|
+
hash: 1
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 4
|
32
|
+
- 3
|
23
33
|
version: 1.4.3
|
24
34
|
type: :runtime
|
25
35
|
version_requirements: *id001
|
@@ -31,6 +41,9 @@ dependencies:
|
|
31
41
|
requirements:
|
32
42
|
- - ">="
|
33
43
|
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 0
|
34
47
|
version: "0"
|
35
48
|
type: :runtime
|
36
49
|
version_requirements: *id002
|
@@ -42,6 +55,10 @@ dependencies:
|
|
42
55
|
requirements:
|
43
56
|
- - ">="
|
44
57
|
- !ruby/object:Gem::Version
|
58
|
+
hash: 27
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
- 8
|
45
62
|
version: "0.8"
|
46
63
|
type: :development
|
47
64
|
version_requirements: *id003
|
@@ -53,6 +70,10 @@ dependencies:
|
|
53
70
|
requirements:
|
54
71
|
- - ">="
|
55
72
|
- !ruby/object:Gem::Version
|
73
|
+
hash: 25
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
- 9
|
56
77
|
version: "0.9"
|
57
78
|
type: :development
|
58
79
|
version_requirements: *id004
|
@@ -64,6 +85,9 @@ dependencies:
|
|
64
85
|
requirements:
|
65
86
|
- - ">="
|
66
87
|
- !ruby/object:Gem::Version
|
88
|
+
hash: 7
|
89
|
+
segments:
|
90
|
+
- 2
|
67
91
|
version: "2"
|
68
92
|
type: :development
|
69
93
|
version_requirements: *id005
|
@@ -81,6 +105,7 @@ files:
|
|
81
105
|
- .rspec
|
82
106
|
- .travis.yml
|
83
107
|
- Gemfile
|
108
|
+
- Gemfile.lock
|
84
109
|
- LICENSE
|
85
110
|
- README.rdoc
|
86
111
|
- Rakefile
|
@@ -89,6 +114,11 @@ files:
|
|
89
114
|
- lib/json/jwe.rb
|
90
115
|
- lib/json/jws.rb
|
91
116
|
- lib/json/jwt.rb
|
117
|
+
- spec/fixtures/rsa/private_key.pem
|
118
|
+
- spec/fixtures/rsa/public_key.pem
|
119
|
+
- spec/helpers/sign_key_fixture_helper.rb
|
120
|
+
- spec/json/jws_spec.rb
|
121
|
+
- spec/json/jwt_spec.rb
|
92
122
|
- spec/spec_helper.rb
|
93
123
|
homepage: https://github.com/nov/json-jwt
|
94
124
|
licenses: []
|
@@ -103,19 +133,30 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
103
133
|
requirements:
|
104
134
|
- - ">="
|
105
135
|
- !ruby/object:Gem::Version
|
136
|
+
hash: 3
|
137
|
+
segments:
|
138
|
+
- 0
|
106
139
|
version: "0"
|
107
140
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
141
|
none: false
|
109
142
|
requirements:
|
110
143
|
- - ">="
|
111
144
|
- !ruby/object:Gem::Version
|
145
|
+
hash: 3
|
146
|
+
segments:
|
147
|
+
- 0
|
112
148
|
version: "0"
|
113
149
|
requirements: []
|
114
150
|
|
115
151
|
rubyforge_project:
|
116
|
-
rubygems_version: 1.8.
|
152
|
+
rubygems_version: 1.8.5
|
117
153
|
signing_key:
|
118
154
|
specification_version: 3
|
119
155
|
summary: JSON Web Token and its family (JSON Web Signature, JSON Web Encryption and JSON Web Key) in Ruby
|
120
156
|
test_files:
|
157
|
+
- spec/fixtures/rsa/private_key.pem
|
158
|
+
- spec/fixtures/rsa/public_key.pem
|
159
|
+
- spec/helpers/sign_key_fixture_helper.rb
|
160
|
+
- spec/json/jws_spec.rb
|
161
|
+
- spec/json/jwt_spec.rb
|
121
162
|
- spec/spec_helper.rb
|