decode_this 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6aa17a4625e0ee56d82538d48b8bf254365ce750
4
+ data.tar.gz: d4b0835f60837ad36e7903b353e1995e7f7f1e6c
5
+ SHA512:
6
+ metadata.gz: 5879f3e3e4c7aa92b74e5809ca34eff17bc9b56132dcef11bebb1419f61c3108ad2336049f4d7b48d2da7e0d86e8fed1f00dafbe0a130cb86d63699db30920ac
7
+ data.tar.gz: 033b2afcd0f6292a1eed1d9a9c7a2214cbb0e3598af8b30c0b75f29b334f0277627a956b3370e57def6f88d0aa28b1cec85190e8f84cce7c8ccb4db98e80d7be
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+ source 'https://rubygems.org'
3
+
4
+ gem 'jwt'
5
+ gem 'huyettings'
6
+
7
+ group :development, :test do
8
+ gem 'rspec'
9
+ gem 'bundler'
10
+ gem 'rake'
11
+ gem 'pry-byebug'
12
+ end
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
data/Readme.md ADDED
@@ -0,0 +1,38 @@
1
+ # DecodeThis
2
+
3
+ Simple decoder JWT token by given key
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'decode_this'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install decode_this
20
+
21
+ ## Usage
22
+
23
+ Configuration file scheme:
24
+ ```
25
+ test:
26
+ algorightm: 'RS256'
27
+ path: 'paht/to/keys'
28
+ ```
29
+
30
+ ```ruby
31
+ token = DecodeThis.call(token, config_file: '/path/to/config.yml', env: :my_env)
32
+ token['field1']
33
+ token['field2']
34
+ ```
35
+
36
+ ## Contributing
37
+
38
+ Bug reports and pull requests are welcome on GitHub at https://github.com/myxaluch/decode_this.
@@ -0,0 +1,18 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'decode_this/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'decode_this'
8
+ spec.version = DecodeThis::VERSION
9
+ spec.summary = 'Decode token. This token'
10
+ spec.description = 'Simple gem for decoding JWT token'
11
+ spec.authors = ['Sasha Kotov']
12
+ spec.email = 'amikotov@gmail.com'
13
+
14
+ spec.files = `git ls-files`.split($/)
15
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.require_paths = ['lib']
18
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+ require 'decode_this/version'
3
+ require 'huyettings'
4
+ require 'openssl'
5
+ require 'jwt'
6
+
7
+ class DecodeThis
8
+ ConfigFileNotFoundError = Class.new(RuntimeError)
9
+ DecodeError = Class.new(RuntimeError)
10
+
11
+ attr_reader :token, :config_file, :env
12
+
13
+ def initialize(token, config_file:, env:)
14
+ @token = token
15
+ @config_file = config_file
16
+ @env = env
17
+ end
18
+
19
+ def call
20
+ JWT.decode(token, public_key, true, algorithm: algorithm).first
21
+
22
+ rescue JWT::ExpiredSignature => err
23
+ logger.warn("Expired JWT token #{err.class} - #{err.message}")
24
+ raise DecodeError
25
+ rescue JWT::VerificationError => err
26
+ logger.warn("Can't verify JWT token #{err.class} - #{err.message}")
27
+ raise DecodeError
28
+ rescue JWT::DecodeError => err
29
+ logger.warn("Can't decode JWT token '#{jwt_token}' #{err.class} - #{err.message}")
30
+ raise DecodeError
31
+ end
32
+
33
+ private
34
+
35
+ def jwt_config
36
+ @jwt_config ||= Huyettings.new(config_file, env)
37
+ end
38
+
39
+ def algorithm
40
+ jwt_config.algorithm
41
+ end
42
+
43
+ def public_key
44
+ private_key.public_key
45
+ end
46
+
47
+ def private_key
48
+ OpenSSL::PKey::RSA.new(pem)
49
+ end
50
+
51
+ def pem
52
+ keys_absolute_path = File.expand_path(jwt_config.path)
53
+
54
+ raise KeyFileNotFoundError.new("Cannot found file in #{jwt_config.path}") unless File.readable?(keys_absolute_path)
55
+ File.read(jwt_config.path)
56
+ end
57
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ class DecodeThis
3
+ VERSION = '0.1.0'
4
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe DecodeThis do
5
+ let(:config_path) { File.expand_path('spec/fixtures/config.yml') }
6
+ let(:payload) { { field: 'foobar' } }
7
+ let(:token) { encode(payload) }
8
+
9
+ subject(:decoded_token) { described_class.new(token, config_file: config_path, env: :test).call }
10
+
11
+ it 'decodes given token correctly' do
12
+ payload.keys.each do |key|
13
+ expect(decoded_token[key.to_s]).to eq(payload[key])
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ test:
2
+ algorithm: 'RS256'
3
+ path: './spec/fixtures/unsecured.pem'
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEogIBAAKCAQEAoH9kIKKZKprgoS9p8h/sHKDlBcFOGOS1leaJ4L+oPlye/RtQ
3
+ P7gjQK50xGw7WgydS+utcY2rGE6EjWzG3FDzWpz1WGV5ecUxfypTxNbiQg4+WiZv
4
+ hoyW+to72245yVaTbxKAdht01naULQZ0KgniOoxFYl9yH8VVVU1aUrZkvePkAKPJ
5
+ rQfzLMYvEBEzHefKsyHPy2w2O9sTTQU0ZGfkcKWxTvnY9UWeDUNHkIdw2g39hLL5
6
+ NXgky1Bg/ofsjCasHpbnrbieIvymqruWpFfmglaVtCjxL7y0iiemLCpkRUVTnJeH
7
+ yIwZZL0WEsiaixAI3hFJfybx8lmil+UFm18wDwIDAQABAoIBAFKbHqrZZWITUthD
8
+ MhFnsrvNZ/L9Wjffx0I+5OojWvG19DKrkzMokCRjZkAOwMGJSpBf3eZbFxuslfbA
9
+ bN3KYGZb8L8tg0dUYjRkUbc3Lj73W8pEjBRBWhgEqNg4tE9XWwzJBgtD+G/FmmBO
10
+ OQ3GBoVB2xhVrcSCaXg9FucJb3J3/w4YS3tPbiSIG3lMOzcf87b10IdeiHjfRPUO
11
+ /PI89/DYX8CQfFa+AG7I30jBl/ihXdpUx+GUguu1dSKeUrNRavGD+N1pmRXKhx18
12
+ 835ybmn4UNzt833M41TUQLFIGZGeaCPJ0Re0vGok9KDeX5760GxmK+gCtSXYYW4m
13
+ AXB0wfkCgYEA0GodtuZWSiZcqA42uSFEYhv61CE+7LJ2RLjhq1c+EbZZXa3IitNA
14
+ jpmn5kMyzjA+6gD1GD+AlBVfSadDg7TtAuY9zBsk+E+tfz+Nn9elGcaSIwm5vJis
15
+ Bc/CfiqzvwGrozDPbkL8P3WpNpPsz108klXiphI3+iCbp8jA5AM1//UCgYEAxSSF
16
+ EyLHDS70BQ62UvObB/B55tpiebJB458qrU/n3KA0BUyhCbZSoYE2aM+U8WUH2Wtr
17
+ l50RmdThkHfSkLQKJDUxBl9Oc22wdYluPUPDLcjO4IlWkw7Wz9nD+ZmHBGR4cQo8
18
+ EznhktwKW4n6I+O2L/qO8j+NK0lsgTrHc6+gQXMCgYBxxxzFtuWwwVSgInJZiwHM
19
+ Fb5PhH7XtW2/grcgVRZ7kPMkozTyJPX/Y383w8O+sLQIB9HGFRTawvgsO3YuNt2V
20
+ UaC3BrKeJNFwwH9OnelyMueg3TRa83YmDg/91M4gHodXJdR4O3V+J3vjYcpMQnhI
21
+ 4z5Cr3uDv716UayMTfxy6QKBgCLQ3keQ3sJvRl0WShDAQOLYD087xiRj3MsMMwdE
22
+ k1gdWtKMw+vpLRKktS0xa8Zt50L4e5nc/VzDgcp3vtIbWacnVa8gacRs3LsFOFjN
23
+ fMy7J/3zgzyZZEp01O1htbyK2dJs0ks676F2BsY/ydNIxcYXY+NYYeABKY5xCQRf
24
+ QdgNAoGADTqtuc4dw2VegWSRJY3aAXUHwu1s4qLP5td4xuH6RKwMk6jLYzjyO4Xa
25
+ mgK4tG31CeDN7PuHDS4M5ZFGh3Iz5w9mLvV+oiWdL/Bk2bDV8ydy76Y3Gka885kZ
26
+ bw3t98Yp619IAje4RGi8VnW1EBfrtoTW3tpoqPReAbaSGFFofWE=
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ require 'bundler/setup'
3
+ require 'decode_this'
4
+
5
+ def encode(payload)
6
+ config = Huyettings.new(File.expand_path('spec/fixtures/config.yml'), :test)
7
+ private_key = OpenSSL::PKey::RSA.new(File.read(config.path))
8
+ JWT.encode(payload, private_key, config.algorithm)
9
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: decode_this
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Sasha Kotov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-07 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Simple gem for decoding JWT token
14
+ email: amikotov@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - ".gitignore"
20
+ - ".rspec"
21
+ - Gemfile
22
+ - Rakefile
23
+ - Readme.md
24
+ - decode_this.gemspec
25
+ - lib/decode_this.rb
26
+ - lib/decode_this/version.rb
27
+ - spec/decode_this_spec.rb
28
+ - spec/fixtures/config.yml
29
+ - spec/fixtures/unsecured.pem
30
+ - spec/spec_helper.rb
31
+ homepage:
32
+ licenses: []
33
+ metadata: {}
34
+ post_install_message:
35
+ rdoc_options: []
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ requirements: []
49
+ rubyforge_project:
50
+ rubygems_version: 2.5.2.1
51
+ signing_key:
52
+ specification_version: 4
53
+ summary: Decode token. This token
54
+ test_files:
55
+ - spec/decode_this_spec.rb
56
+ - spec/fixtures/config.yml
57
+ - spec/fixtures/unsecured.pem
58
+ - spec/spec_helper.rb