From 1bc53bd41dfab690460798a2e94bca35ee5397cb Mon Sep 17 00:00:00 2001 From: Tim Rudat Date: Fri, 19 Aug 2016 14:43:34 +0200 Subject: [PATCH] Create specs for README.md examples (#159) * Bump version to 1.5.5.dev * :construction_worker: Add specs for README examples * Fix json development dependency --- README.md | 4 +- ruby-jwt.gemspec | 1 + spec/integration/readme_examples_spec.rb | 170 +++++++++++++++++++++++ 3 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 spec/integration/readme_examples_spec.rb diff --git a/README.md b/README.md index 6ac68c37..e60efa85 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ payload = {:data => 'test'} # IMPORTANT: set nil as password parameter token = JWT.encode payload, nil, 'none' -# eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJ0ZXN0IjoiZGF0YSJ9. +# eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJkYXRhIjoidGVzdCJ9. puts token # Set password to nil and validation to false otherwise this won't work @@ -71,7 +71,7 @@ hmac_secret = 'my$ecretK3y' token = JWT.encode payload, hmac_secret, 'HS256' -# eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0ZXN0IjoiZGF0YSJ9._sLPAGP-IXgho8BkMGQ86N2mah7vDyn0L5hOR4UkfoI +# eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJkYXRhIjoidGVzdCJ9.ZxW8go9hz3ETCSfxFxpwSkYg_602gOPKearsf6DsxgY puts token decoded_token = JWT.decode token, hmac_secret, true, { :algorithm => 'HS256' } diff --git a/ruby-jwt.gemspec b/ruby-jwt.gemspec index 031a10a0..06edd665 100644 --- a/ruby-jwt.gemspec +++ b/ruby-jwt.gemspec @@ -22,6 +22,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'bundler' spec.add_development_dependency 'rake' + spec.add_development_dependency 'json', '< 2.0' spec.add_development_dependency 'rspec' spec.add_development_dependency 'simplecov' spec.add_development_dependency 'simplecov-json' diff --git a/spec/integration/readme_examples_spec.rb b/spec/integration/readme_examples_spec.rb new file mode 100644 index 00000000..d6824031 --- /dev/null +++ b/spec/integration/readme_examples_spec.rb @@ -0,0 +1,170 @@ +require_relative '../spec_helper' +require 'jwt' + +describe 'README.md code test' do + context 'algorithm usage' do + let(:payload) { {:data => 'test'} } + + it 'NONE' do + token = JWT.encode payload, nil, 'none' + decoded_token = JWT.decode token, nil, false + + expect(token).to eq 'eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJkYXRhIjoidGVzdCJ9.' + expect(decoded_token).to eq [ + {'data' => 'test'}, + {'typ' => 'JWT', 'alg' => 'none'} + ] + end + + it 'HMAC' do + token = JWT.encode payload, 'my$ecretK3y', 'HS256' + decoded_token = JWT.decode token, 'my$ecretK3y', false + + expect(token).to eq 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJkYXRhIjoidGVzdCJ9.ZxW8go9hz3ETCSfxFxpwSkYg_602gOPKearsf6DsxgY' + expect(decoded_token).to eq [ + {'data' => 'test'}, + {'typ' => 'JWT', 'alg' => 'HS256'} + ] + end + + it 'RSA' do + rsa_private = OpenSSL::PKey::RSA.generate 2048 + rsa_public = rsa_private.public_key + + token = JWT.encode payload, rsa_private, 'RS256' + decoded_token = JWT.decode token, rsa_public, true, {:algorithm => 'RS256'} + + expect(decoded_token).to eq [ + {'data' => 'test'}, + {'typ' => 'JWT', 'alg' => 'RS256'} + ] + end + + it 'ECDSA' do + ecdsa_key = OpenSSL::PKey::EC.new 'prime256v1' + ecdsa_key.generate_key + ecdsa_public = OpenSSL::PKey::EC.new ecdsa_key + ecdsa_public.private_key = nil + + token = JWT.encode payload, ecdsa_key, 'ES256' + decoded_token = JWT.decode token, ecdsa_public, true, {:algorithm => 'ES256'} + + expect(decoded_token).to eq [ + {'data' => 'test'}, + {'typ' => 'JWT', 'alg' => 'ES256'} + ] + end + end + + context 'claims' do + let(:hmac_secret) { 'MyP4ssW0rD' } + + context 'exp' do + it 'without leeway' do + exp = Time.now.to_i + 4 * 3600 + exp_payload = {:data => 'data', :exp => exp} + + token = JWT.encode exp_payload, hmac_secret, 'HS256' + + expect do + JWT.decode token, hmac_secret, true, {:algorithm => 'HS256'} + end.not_to raise_error + end + + it 'with leeway' do + exp = Time.now.to_i - 10 + leeway = 30 # seconds + + exp_payload = {:data => 'data', :exp => exp} + + token = JWT.encode exp_payload, hmac_secret, 'HS256' + + expect do + JWT.decode token, hmac_secret, true, {:leeway => leeway, :algorithm => 'HS256'} + end.not_to raise_error + end + end + + context 'nbf' do + it 'without leeway' do + nbf = Time.now.to_i - 3600 + nbf_payload = {:data => 'data', :nbf => nbf} + token = JWT.encode nbf_payload, hmac_secret, 'HS256' + + expect do + JWT.decode token, hmac_secret, true, {:algorithm => 'HS256'} + end.not_to raise_error + end + + it 'with leeway' do + nbf = Time.now.to_i + 10 + leeway = 30 + nbf_payload = {:data => 'data', :nbf => nbf} + token = JWT.encode nbf_payload, hmac_secret, 'HS256' + + expect do + JWT.decode token, hmac_secret, true, {:leeway => leeway, :algorithm => 'HS256'} + end.not_to raise_error + end + end + + it 'iss' do + iss = 'My Awesome Company Inc. or https://my.awesome.website/' + iss_payload = {:data => 'data', :iss => iss} + + token = JWT.encode iss_payload, hmac_secret, 'HS256' + + expect do + + end.not_to raise_error + end + + context 'aud' do + it 'array' do + expect do + + end.not_to raise_error + end + + it 'string' do + expect do + + end.not_to raise_error + end + end + + it 'jti' do + iat = Time.now.to_i + hmac_secret = 'test' + jti_raw = [hmac_secret, iat].join(':').to_s + jti = Digest::MD5.hexdigest(jti_raw) + jti_payload = {:data => 'data', :iat => iat, :jti => jti} + + token = JWT.encode jti_payload, hmac_secret, 'HS256' + + expect do + JWT.decode token, hmac_secret, true, {:verify_jti => true, :algorithm => 'HS256'} + end.not_to raise_error + end + + context 'iat' do + it 'without leeway' do + expect do + + end.not_to raise_error + end + + it 'with leeway' do + expect do + + end.not_to raise_error + end + end + + it 'sub' do + expect do + + end.not_to raise_error + end + end +end \ No newline at end of file