json-jwt 0.2.0 → 0.3.0
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 -0
- data/Gemfile +1 -5
- data/Gemfile.lock +3 -3
- data/Rakefile +9 -16
- data/VERSION +1 -1
- data/json-jwt.gemspec +1 -5
- data/lib/json/jwk.rb +12 -12
- data/lib/json/jwk/set.rb +1 -1
- data/lib/json/jws.rb +3 -3
- data/lib/json/jwt.rb +11 -7
- data/spec/json/jwk_spec.rb +23 -10
- data/spec/json/jws_spec.rb +7 -7
- data/spec/json/jwt_spec.rb +53 -8
- data/spec/spec_helper.rb +1 -4
- metadata +2 -2
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
json-jwt (0.
|
4
|
+
json-jwt (0.3.0)
|
5
5
|
activesupport (>= 2.3)
|
6
6
|
i18n
|
7
7
|
json (>= 1.4.3)
|
@@ -31,16 +31,16 @@ GEM
|
|
31
31
|
rspec-core (2.11.1)
|
32
32
|
rspec-expectations (2.11.3)
|
33
33
|
diff-lcs (~> 1.1.3)
|
34
|
-
rspec-mocks (2.11.
|
34
|
+
rspec-mocks (2.11.3)
|
35
35
|
url_safe_base64 (0.2.1)
|
36
36
|
yamler (0.1.0)
|
37
37
|
|
38
38
|
PLATFORMS
|
39
|
+
java
|
39
40
|
ruby
|
40
41
|
|
41
42
|
DEPENDENCIES
|
42
43
|
cover_me (>= 1.2.0)
|
43
|
-
jruby-openssl (>= 0.7)
|
44
44
|
json-jwt!
|
45
45
|
rake (>= 0.8)
|
46
46
|
rspec (>= 2)
|
data/Rakefile
CHANGED
@@ -4,22 +4,15 @@ Bundler::GemHelper.install_tasks
|
|
4
4
|
require 'rspec/core/rake_task'
|
5
5
|
RSpec::Core::RakeTask.new(:spec)
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
CoverMe.complete!
|
13
|
-
end
|
14
|
-
end
|
15
|
-
task :spec do
|
16
|
-
Rake::Task['cover_me:report'].invoke
|
17
|
-
end
|
18
|
-
else
|
19
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
20
|
-
spec.rcov = true
|
21
|
-
spec.rcov_opts = ['-Ilib -Ispec --exclude spec,gems']
|
7
|
+
namespace :cover_me do
|
8
|
+
desc "Generates and opens code coverage report."
|
9
|
+
task :report do
|
10
|
+
require 'cover_me'
|
11
|
+
CoverMe.complete!
|
22
12
|
end
|
23
13
|
end
|
14
|
+
task :spec do
|
15
|
+
Rake::Task['cover_me:report'].invoke
|
16
|
+
end
|
24
17
|
|
25
|
-
task :
|
18
|
+
task default: :spec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/json-jwt.gemspec
CHANGED
@@ -15,10 +15,6 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.add_runtime_dependency "activesupport", ">= 2.3"
|
16
16
|
s.add_runtime_dependency "i18n"
|
17
17
|
s.add_development_dependency "rake", ">= 0.8"
|
18
|
-
|
19
|
-
s.add_development_dependency "cover_me", ">= 1.2.0"
|
20
|
-
else
|
21
|
-
s.add_development_dependency "rcov", ">= 0.9"
|
22
|
-
end
|
18
|
+
s.add_development_dependency "cover_me", ">= 1.2.0"
|
23
19
|
s.add_development_dependency "rspec", ">= 2"
|
24
20
|
end
|
data/lib/json/jwk.rb
CHANGED
@@ -29,8 +29,8 @@ module JSON
|
|
29
29
|
hex_x = hex[2, data_len/2]
|
30
30
|
hex_y = hex[2+data_len/2, data_len/2]
|
31
31
|
@ecdsa_coodinates = {
|
32
|
-
:
|
33
|
-
:
|
32
|
+
x: hex_x,
|
33
|
+
y: hex_y
|
34
34
|
}
|
35
35
|
end
|
36
36
|
@ecdsa_coodinates
|
@@ -40,16 +40,16 @@ module JSON
|
|
40
40
|
hash = case public_key
|
41
41
|
when OpenSSL::PKey::RSA
|
42
42
|
{
|
43
|
-
:
|
44
|
-
:
|
45
|
-
:
|
43
|
+
alg: :RSA,
|
44
|
+
exp: UrlSafeBase64.encode64(public_key.e.to_s(2)),
|
45
|
+
mod: UrlSafeBase64.encode64(public_key.n.to_s(2))
|
46
46
|
}
|
47
47
|
when OpenSSL::PKey::EC
|
48
48
|
{
|
49
|
-
:
|
50
|
-
:
|
51
|
-
:
|
52
|
-
:
|
49
|
+
alg: :EC,
|
50
|
+
crv: ecdsa_curve_name(public_key),
|
51
|
+
x: UrlSafeBase64.encode64(ecdsa_coodinates(public_key)[:x].to_s),
|
52
|
+
y: UrlSafeBase64.encode64(ecdsa_coodinates(public_key)[:y].to_s)
|
53
53
|
}
|
54
54
|
else
|
55
55
|
raise UnknownAlgorithm.new('Unknown Algorithm')
|
@@ -59,15 +59,15 @@ module JSON
|
|
59
59
|
|
60
60
|
class << self
|
61
61
|
def decode(jwk)
|
62
|
-
case jwk[:alg]
|
63
|
-
when
|
62
|
+
case jwk[:alg].to_s
|
63
|
+
when 'RSA'
|
64
64
|
exp = OpenSSL::BN.new UrlSafeBase64.decode64(jwk[:exp]), 2
|
65
65
|
mod = OpenSSL::BN.new UrlSafeBase64.decode64(jwk[:mod]), 2
|
66
66
|
key = OpenSSL::PKey::RSA.new
|
67
67
|
key.e = exp
|
68
68
|
key.n = mod
|
69
69
|
key
|
70
|
-
when
|
70
|
+
when 'EC'
|
71
71
|
raise NotImplementedError.new('Not Implemented Yet')
|
72
72
|
else
|
73
73
|
raise UnknownAlgorithm.new('Unknown Algorithm')
|
data/lib/json/jwk/set.rb
CHANGED
data/lib/json/jws.rb
CHANGED
@@ -13,8 +13,8 @@ module JSON
|
|
13
13
|
self
|
14
14
|
end
|
15
15
|
|
16
|
-
def verify(
|
17
|
-
valid?(
|
16
|
+
def verify(public_key_or_secret)
|
17
|
+
public_key_or_secret && valid?(public_key_or_secret) or
|
18
18
|
raise VerificationFailed
|
19
19
|
end
|
20
20
|
|
@@ -66,7 +66,7 @@ module JSON
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
-
def valid?(
|
69
|
+
def valid?(public_key_or_secret)
|
70
70
|
case
|
71
71
|
when hmac?
|
72
72
|
secret = public_key_or_secret
|
data/lib/json/jwt.rb
CHANGED
@@ -14,8 +14,8 @@ module JSON
|
|
14
14
|
|
15
15
|
def initialize(claims)
|
16
16
|
@header = {
|
17
|
-
:
|
18
|
-
:
|
17
|
+
typ: :JWT,
|
18
|
+
alg: :none
|
19
19
|
}
|
20
20
|
[:exp, :nbf, :iat].each do |key|
|
21
21
|
claims[key] = claims[key].to_i if claims[key]
|
@@ -28,12 +28,12 @@ module JSON
|
|
28
28
|
JWS.new(self).sign!(private_key_or_secret)
|
29
29
|
end
|
30
30
|
|
31
|
-
def verify(
|
31
|
+
def verify(public_key_or_secret = nil)
|
32
32
|
if header[:alg].to_s == 'none'
|
33
33
|
raise UnexpectedAlgorithm if public_key_or_secret
|
34
34
|
signature == '' or raise VerificationFailed
|
35
35
|
else
|
36
|
-
JWS.new(self).verify(
|
36
|
+
JWS.new(self).verify(public_key_or_secret)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -54,10 +54,14 @@ module JSON
|
|
54
54
|
header, claims, signature = jwt_string.split('.', 3).collect do |segment|
|
55
55
|
UrlSafeBase64.decode64 segment.to_s
|
56
56
|
end
|
57
|
+
header, claims = [header, claims].collect do |json|
|
58
|
+
JSON.parse json, symbolize_names: true, symbolize_keys: true
|
59
|
+
end
|
57
60
|
signature_base_string = jwt_string.split('.')[0, 2].join('.')
|
58
|
-
jwt = new
|
59
|
-
jwt.header =
|
60
|
-
jwt.
|
61
|
+
jwt = new claims
|
62
|
+
jwt.header = header
|
63
|
+
jwt.signature = signature
|
64
|
+
jwt.verify key_or_secret unless key_or_secret == :skip_verification
|
61
65
|
jwt
|
62
66
|
when 3 # JWE
|
63
67
|
# TODO: Concept code first.
|
data/spec/json/jwk_spec.rb
CHANGED
@@ -9,7 +9,7 @@ describe JSON::JWK do
|
|
9
9
|
its(:mod) { jwk[:mod].should == UrlSafeBase64.encode64(public_key.n.to_s(2)) }
|
10
10
|
|
11
11
|
context 'when kid/use options given' do
|
12
|
-
let(:jwk) { JSON::JWK.new public_key, :
|
12
|
+
let(:jwk) { JSON::JWK.new public_key, kid: '12345', use: :sig }
|
13
13
|
it { jwk.should include :kid, :use }
|
14
14
|
its(:kid) { jwk[:kid].should == '12345' }
|
15
15
|
its(:use) { jwk[:use].should == :sig }
|
@@ -20,22 +20,22 @@ describe JSON::JWK do
|
|
20
20
|
let(:expected_coodinates) do
|
21
21
|
{
|
22
22
|
256 => {
|
23
|
-
:
|
24
|
-
:
|
23
|
+
x: 'OTUyMUU1NjJFOEQ3NDA0MTRDOEEyQjk5RDQ2NkZERDVFNUYwQzUzMUFGNENBNkMxMTY2Q0NFQzUzQjVGRDMwRg',
|
24
|
+
y: 'MDIwQTRENTQwN0ExQkJFNzQwNkJDNjIyMUI5NjUxQTY1NjY5Mjg4QUU1OEE1NjRDNjcwN0Q1RkQ5REM3MDlCNw'
|
25
25
|
},
|
26
26
|
384 => {
|
27
|
-
:
|
28
|
-
:
|
27
|
+
x: 'QTY1Q0MwQTcyMTY3MkJCQUIzODYwRTU3OUM4NjVCMTYzREExNjY4MUY2NTVEOTc4RjkxMTY2RUMzOUVDMzRDMUJEQjcyQUFCQTVGQUI2NDcyOERGMjgwMDVCNzA1NDZE',
|
28
|
+
y: 'OEIxMDczN0RGODY0RERGNzFCOTlFOEE5MThCOTJGNDAxMzQyQ0RFMzY2RTkwMkY3ODRFNTEzMUZBMjA1MDczMzhCRDE4RUM3QjA2NEU4QTRENEQzQjI5MkUzOTYyQkRC'
|
29
29
|
},
|
30
30
|
512 => {
|
31
|
-
:
|
32
|
-
:
|
31
|
+
x: 'MDFDMzAyMEZFNkI0NkJBQUU3MTNENEVGMEI0OThFQTg1RkMzMTk3NDYwRTU4REUyNERCRTFFMUNEQzEzOUI2OTAzRUEyQkEzQzdEMzNGN0ZDNzdGMTQ2MUVCRDBFODY5QUIzMTI3RTJCNjBGNjE5QTJFMUFDNkM4M0M0ODBCRDJBRkZG',
|
32
|
+
y: 'MDE0MkQ4MTFERjI1RjlCNTdGMDQ4REJDRjVBN0IzODUyMkQ5RDUxMEM1REE1QjYwMENGMTMyRjU4RUQ4QjZBNjFBRTFDMjVDQTYyQ0IzNTQzMzI5NUQ2QzAxQTdBNzIzODNBNEQ3MjBEOTI4NTZCNTU3NjYxMzc4RDM4OEExQkI4MjM2'
|
33
33
|
}
|
34
34
|
}
|
35
35
|
end
|
36
36
|
[256, 384, 512].each do |digest_length|
|
37
37
|
describe "EC#{digest_length}" do
|
38
|
-
let(:jwk) { JSON::JWK.new public_key(:ecdsa, :
|
38
|
+
let(:jwk) { JSON::JWK.new public_key(:ecdsa, digest_length: digest_length) }
|
39
39
|
it { jwk.should include :alg, :crv, :x, :y }
|
40
40
|
its(:alg) { jwk[:alg].should == :EC }
|
41
41
|
its(:x) { jwk[:x].should == expected_coodinates[digest_length][:x] }
|
@@ -74,7 +74,8 @@ describe JSON::JWK do
|
|
74
74
|
let(:exp) { 'AQAB' }
|
75
75
|
let(:mod) { 'AK8ppaAGn6N3jDic2DhDN5mI5mWzvhfL1AFZOS9q2EBM8L5sjZbYiaHeNoKillZGmEF9a9g6Z20bDnoHTuHPsx93HYkZqPumFZ8K9lLCbqKAMWw2Qgk10RgrZ-kblJotTBCeer9-tZSWO-OWFzP4gp8MpSuQOQbwTJwDgEkFIQLUK2YgzWbn1PoW8xcfbVyWhZD880ELGRW6GhRgYAl0DN_EQS8kyUa0CusYCzOOg2W3-7qjYeojyP6jiOEr-eyjC7hcUvTVoTfz84BiZv72KS3i5JS8ZNNuRp5Ce51wjoDDUoNxDLWv6Da6qMaGpKz6NTSNbvhE_KFhpp4wf5yRQD8=' }
|
76
76
|
let(:pem) do
|
77
|
-
|
77
|
+
if RUBY_VERSION >= '1.9.3'
|
78
|
+
<<-PEM
|
78
79
|
-----BEGIN PUBLIC KEY-----
|
79
80
|
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArymloAafo3eMOJzYOEM3
|
80
81
|
mYjmZbO+F8vUAVk5L2rYQEzwvmyNltiJod42gqKWVkaYQX1r2DpnbRsOegdO4c+z
|
@@ -84,7 +85,19 @@ nwylK5A5BvBMnAOASQUhAtQrZiDNZufU+hbzFx9tXJaFkPzzQQsZFboaFGBgCXQM
|
|
84
85
|
LeLklLxk025GnkJ7nXCOgMNSg3EMta/oNrqoxoakrPo1NI1u+ET8oWGmnjB/nJFA
|
85
86
|
PwIDAQAB
|
86
87
|
-----END PUBLIC KEY-----
|
87
|
-
|
88
|
+
PEM
|
89
|
+
else
|
90
|
+
<<-PEM
|
91
|
+
-----BEGIN RSA PUBLIC KEY-----
|
92
|
+
MIIBCgKCAQEArymloAafo3eMOJzYOEM3mYjmZbO+F8vUAVk5L2rYQEzwvmyNltiJ
|
93
|
+
od42gqKWVkaYQX1r2DpnbRsOegdO4c+zH3cdiRmo+6YVnwr2UsJuooAxbDZCCTXR
|
94
|
+
GCtn6RuUmi1MEJ56v361lJY745YXM/iCnwylK5A5BvBMnAOASQUhAtQrZiDNZufU
|
95
|
+
+hbzFx9tXJaFkPzzQQsZFboaFGBgCXQM38RBLyTJRrQK6xgLM46DZbf7uqNh6iPI
|
96
|
+
/qOI4Sv57KMLuFxS9NWhN/PzgGJm/vYpLeLklLxk025GnkJ7nXCOgMNSg3EMta/o
|
97
|
+
NrqoxoakrPo1NI1u+ET8oWGmnjB/nJFAPwIDAQAB
|
98
|
+
-----END RSA PUBLIC KEY-----
|
99
|
+
PEM
|
100
|
+
end
|
88
101
|
end
|
89
102
|
|
90
103
|
it { should be_instance_of OpenSSL::PKey::RSA }
|
data/spec/json/jws_spec.rb
CHANGED
@@ -12,12 +12,12 @@ describe JSON::JWS do
|
|
12
12
|
let(:decoded) { JSON::JWT.decode signed.to_s, public_key_or_secret }
|
13
13
|
let(:claims) do
|
14
14
|
{
|
15
|
-
:
|
16
|
-
:
|
15
|
+
iss: 'joe',
|
16
|
+
exp: 1300819380,
|
17
17
|
:'http://example.com/is_root' => true
|
18
18
|
}
|
19
19
|
end
|
20
|
-
let(:expected_signature)
|
20
|
+
let(:expected_signature) do
|
21
21
|
{
|
22
22
|
:HS256 => 'DyuTgO2Ggb5nrhkkhI-RjVYIBe3o8oL4ijkAn94YPxQ',
|
23
23
|
:HS384 => 'a5-7rr61TG8Snv9xxJ7l064ky-SCq1Mswe9t8HEorvoc_nnfIeUy9WQCLMIli34R',
|
@@ -26,7 +26,7 @@ describe JSON::JWS do
|
|
26
26
|
:RS384 => 'lT5JbytGKgG9QrwkJuxgw7UjmN9tjkEQW9pVGR2XnKEdC0_wLNIzAmT-jTwyMDGBLUkWO7opDOP6Xy6_DOTg58k9PwVkyQzrLnmxJMEng2Q-aMqcitRSIvUk3DPy8kemp8yUPls9NzWmByM2GoUVHbDsR0r-tZN-g_9QYev32mvMhjMr30JI5S2xiRjc9m2GAaXMOQmNTovJgV4bgCp4UjruCrA0BD1JJwDqKYoR_YYr_ALcVjD_LUgy80udJvbi8MAYJVUf0QYtQDrX2wnT_-eiiWjD5XafLuXEQVDRh-v2MKAwdvtXMq5cZ08Zjl2SyHxJ3OqhEeWPvYGltxZh_A',
|
27
27
|
:RS512 => 'EHeGM2Mo3ghhUfSB99AlREehrbC6OPE-nYL_rwf88ysTnJ8L1QQ0UuCrXq4SpRutGLK_bYTK3ZALvFRPoOgK_g0QWmqv6qjQRU_QTxoq8y8APP-IgKKDuIiGH6daBV2rAPLDReqYNKsKjmTvZJo2c0a0e_WZkkj_ZwpgjTG3v0gW9lbDAzLJDz18eqtR4ZO7JTu_fyNrUrNk-w2_wpxSsn9sygIMp0lKE0_pt0b01fz3gjTDjlltU0cKSalUp4geaBDH7QRcexrolIctdQFbNKTXQxoigxD3NLNkKGH7f6A8KZdcOm8AnEjullcZs8_OWGnW43p1qrxoBRSivb9pqQ'
|
28
28
|
}
|
29
|
-
|
29
|
+
end
|
30
30
|
|
31
31
|
shared_examples_for :jwt_with_alg do
|
32
32
|
it { should == jwt }
|
@@ -120,8 +120,8 @@ describe JSON::JWS do
|
|
120
120
|
|
121
121
|
[:ES256, :ES384, :ES512].each do |algorithm|
|
122
122
|
describe algorithm do
|
123
|
-
let(:private_key_or_secret) { private_key
|
124
|
-
let(:public_key_or_secret)
|
123
|
+
let(:private_key_or_secret) { private_key :ecdsa, digest_length: algorithm.to_s[2,3].to_i }
|
124
|
+
let(:public_key_or_secret) { public_key :ecdsa, digest_length: algorithm.to_s[2,3].to_i }
|
125
125
|
let(:alg) { algorithm }
|
126
126
|
it_behaves_like :success_signature_verification
|
127
127
|
end
|
@@ -131,7 +131,7 @@ describe JSON::JWS do
|
|
131
131
|
let(:alg) { :unknown }
|
132
132
|
it do
|
133
133
|
expect do
|
134
|
-
jws.verify '
|
134
|
+
jws.verify 'key'
|
135
135
|
end.to raise_error JSON::JWS::InvalidFormat
|
136
136
|
end
|
137
137
|
end
|
data/spec/json/jwt_spec.rb
CHANGED
@@ -2,10 +2,16 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe JSON::JWT do
|
4
4
|
let(:jwt) { JSON::JWT.new claims }
|
5
|
+
let(:jws) do
|
6
|
+
jwt.header[:alg] = :HS256
|
7
|
+
jws = JSON::JWS.new jwt
|
8
|
+
jws.signature = 'signature'
|
9
|
+
jws
|
10
|
+
end
|
5
11
|
let(:claims) do
|
6
12
|
{
|
7
|
-
:
|
8
|
-
:
|
13
|
+
iss: 'joe',
|
14
|
+
exp: 1300819380,
|
9
15
|
:'http://example.com/is_root' => true
|
10
16
|
}
|
11
17
|
end
|
@@ -39,36 +45,49 @@ describe JSON::JWT do
|
|
39
45
|
|
40
46
|
describe '#verify' do
|
41
47
|
context 'when not signed nor encrypted' do
|
48
|
+
let(:jwt) do
|
49
|
+
header, claims, signature = no_signed.split('.', 3).collect do |segment|
|
50
|
+
UrlSafeBase64.decode64 segment.to_s
|
51
|
+
end
|
52
|
+
header, claims = [header, claims].collect do |json|
|
53
|
+
JSON.parse json, symbolize_names: true, symbolize_keys: true
|
54
|
+
end
|
55
|
+
jwt = JSON::JWT.new claims
|
56
|
+
jwt.header = header
|
57
|
+
jwt.signature = signature
|
58
|
+
jwt
|
59
|
+
end
|
60
|
+
|
42
61
|
context 'when no signature nor public_key_or_secret given' do
|
43
62
|
it do
|
44
|
-
jwt.verify
|
63
|
+
jwt.verify.should be_true
|
45
64
|
end
|
46
65
|
end
|
47
66
|
|
48
67
|
context 'when public_key_or_secret given' do
|
49
68
|
it do
|
50
69
|
expect do
|
51
|
-
jwt.verify
|
70
|
+
jwt.verify 'secret'
|
52
71
|
end.to raise_error JSON::JWT::UnexpectedAlgorithm
|
53
72
|
end
|
54
73
|
end
|
55
74
|
|
56
75
|
context 'when signature given' do
|
76
|
+
before { jwt.signature = 'signature' }
|
77
|
+
|
57
78
|
it do
|
58
79
|
expect do
|
59
|
-
jwt.verify
|
80
|
+
jwt.verify
|
60
81
|
end.to raise_error JSON::JWT::VerificationFailed
|
61
82
|
end
|
62
83
|
end
|
63
84
|
end
|
64
85
|
|
65
86
|
context 'when signed' do
|
66
|
-
before { jwt.header[:alg] = :HS256 }
|
67
87
|
it 'should delegate verification to JWS' do
|
68
|
-
jws = JSON::JWS.new jwt
|
69
88
|
jws.should_receive(:verify)
|
70
89
|
JSON::JWS.should_receive(:new).and_return(jws)
|
71
|
-
jwt.verify '
|
90
|
+
jwt.verify 'shared_secret'
|
72
91
|
end
|
73
92
|
end
|
74
93
|
end
|
@@ -82,6 +101,32 @@ describe JSON::JWT do
|
|
82
101
|
end
|
83
102
|
end
|
84
103
|
|
104
|
+
context 'when signed' do
|
105
|
+
context 'when no secret/key given' do
|
106
|
+
it 'should do verification' do
|
107
|
+
expect do
|
108
|
+
JSON::JWT.decode jws.to_s
|
109
|
+
end.to raise_error JSON::JWT::VerificationFailed
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context 'when secret/key given' do
|
114
|
+
it 'should do verification' do
|
115
|
+
expect do
|
116
|
+
JSON::JWT.decode jws.to_s, 'secret'
|
117
|
+
end.to raise_error JSON::JWT::VerificationFailed
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context 'when :skip_verification given as secret/key' do
|
122
|
+
it 'should skip verification' do
|
123
|
+
expect do
|
124
|
+
jwt = JSON::JWT.decode jws.to_s, :skip_verification
|
125
|
+
end.not_to raise_error
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
85
130
|
context 'when JSON parse failed' do
|
86
131
|
it do
|
87
132
|
expect do
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json-jwt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-10-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|