json-jwt 0.0.0 → 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.
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
|