fresh_jwt 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3db90e474ada5fe77cce913c8cfeab01a059f22859b83d743dcf1ca9254d7fbc
4
- data.tar.gz: fb524e5cbe83e56733e8294741c9f104a9535fa710a8dfed4af761db0334420d
3
+ metadata.gz: 603391519afdf2628ea61efed85564ece7c9bb57f9bdc17a9d526bb0fb4817c8
4
+ data.tar.gz: 50ee1e78355778ec9576dc7f51dc0ad568be71ec2d3b0322c340860a5bdbdb68
5
5
  SHA512:
6
- metadata.gz: e3aa6737e66e4ce4f6c721a8a72c1ef2aa428026cba551edb792e1ba43463b3b2bed5b743678293e06c3eddcc198ef23c364ed17ff5e5b66f7e37a2f33a2c3fd
7
- data.tar.gz: 387704eb2eefb1c2cce0b88d1c82fd152d5e6faef365b43cf8788d67d44294c9f98ed49c12e7f7b75d4b447f53137d68831dd02ee2f854502e2b160d7d4f15bf
6
+ metadata.gz: 0a6ef48edfaa81e251bd73fe7ad0b6bbc8a40c3fa58b6cd161833f09004f15f3629c204011df855977f75eae7994483713765421550bad1a93dca060250fa5ca
7
+ data.tar.gz: 73d729094f74fc0daa5b269897ad8f6f93c62d6794e779174ca94f43202d5bf90d46d7b7067db917a89a34017f3d5b72e73981e20f921188a50f4f683cba0f3c
data/Gemfile CHANGED
@@ -2,6 +2,10 @@
2
2
  # A sample Gemfile
3
3
  source "https://rubygems.org"
4
4
 
5
+ # Specify your gem's dependencies in fresh_jwt.gemspec
6
+ gemspec
7
+
8
+ =begin
5
9
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
10
 
7
11
  ruby "2.7.3"
@@ -15,4 +19,7 @@ gem 'rspec'
15
19
  # gem 'jwt_claims'
16
20
 
17
21
  gem 'pry'
18
- gem 'timecop'
22
+ gem 'timecop'
23
+
24
+ gem 'simplecov', require: false, group: :test
25
+ =end
data/Gemfile.lock CHANGED
@@ -4,6 +4,7 @@ GEM
4
4
  coderay (1.1.3)
5
5
  concurrent-ruby (1.1.9)
6
6
  diff-lcs (1.4.4)
7
+ docile (1.4.0)
7
8
  dry-configurable (0.12.1)
8
9
  concurrent-ruby (~> 1.0)
9
10
  dry-core (~> 0.5, >= 0.5.0)
@@ -60,6 +61,12 @@ GEM
60
61
  diff-lcs (>= 1.2.0, < 2.0)
61
62
  rspec-support (~> 3.10.0)
62
63
  rspec-support (3.10.2)
64
+ simplecov (0.21.2)
65
+ docile (~> 1.1)
66
+ simplecov-html (~> 0.11)
67
+ simplecov_json_formatter (~> 0.1)
68
+ simplecov-html (0.12.3)
69
+ simplecov_json_formatter (0.1.3)
63
70
  timecop (0.9.4)
64
71
 
65
72
  PLATFORMS
@@ -72,6 +79,7 @@ DEPENDENCIES
72
79
  jwt
73
80
  pry
74
81
  rspec
82
+ simplecov
75
83
  timecop
76
84
 
77
85
  RUBY VERSION
data/README.md CHANGED
@@ -1 +1,19 @@
1
- # fresh_jwt
1
+ # fresh_jwt
2
+
3
+ Userfull links for develpoment
4
+
5
+ gist with access+refresh implementation
6
+ https://gist.github.com/jesster2k10/e626ee61d678350a21a9d3e81da2493e
7
+
8
+ api_guard
9
+ https://github.com/Gokul595/api_guard
10
+
11
+ yookassa
12
+ https://github.com/paderinandrey/yookassa
13
+
14
+ # rfc about claims
15
+ https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.7
16
+
17
+
18
+ # how to written factory bot - it is usefull for my decorator
19
+ https://twitter.com/JasonSwett/status/1408066341223821320/photo/1
data/fresh_jwt.gemspec ADDED
@@ -0,0 +1,27 @@
1
+
2
+ Gem::Specification.new do |s|
3
+ s.name = 'fresh_jwt'
4
+ s.version = '0.0.2'
5
+ s.summary = 'Fresh JWT token!'
6
+ s.description = 'Issue access JWT & secure with refresh token'
7
+ s.authors = ["Andrei Mosin"]
8
+ s.email = 'otmosina@gmail.com'
9
+ s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
10
+ s.test_files = s.files.grep(/^spec/)
11
+ s.homepage = 'https://rubygems.org/gems/fresh_jwt'
12
+ s.license = 'MIT'
13
+
14
+ s.platform = Gem::Platform::RUBY
15
+ s.required_ruby_version = '>= 2.7.3'
16
+
17
+ s.add_runtime_dependency 'jwt', '~> 2.2.3'
18
+ s.add_runtime_dependency 'dry-initializer', '~> 3.0'
19
+ s.add_runtime_dependency 'dry-monads', '~> 1.3'
20
+ s.add_runtime_dependency 'dry-validation', '~> 1.6'
21
+
22
+ s.add_development_dependency 'pry', '~> 0.14'
23
+ s.add_development_dependency 'rspec', '~> 3.10'
24
+ s.add_development_dependency 'simplecov', '~> 0.22'
25
+ s.add_development_dependency 'timecop', '~> 0.9'
26
+
27
+ end
data/lib/fresh_jwt.rb CHANGED
@@ -13,6 +13,8 @@ require_relative 'fresh_jwt/version'
13
13
  require_relative 'fresh_jwt/validator'
14
14
  require_relative 'fresh_jwt/entity/access_token'
15
15
  require_relative 'fresh_jwt/issuer'
16
+ require_relative 'fresh_jwt/store_old'
17
+ require_relative 'fresh_jwt/refresher'
16
18
 
17
19
 
18
20
  # require 'dry/monads'
@@ -7,6 +7,9 @@ module FreshJwt
7
7
  option :token, proc(&:to_s)
8
8
  option :issued_at, proc(&:to_i), default: -> { Time.now.to_i }
9
9
 
10
+ def expired?
11
+ Time.now.to_i > self.expired_at
12
+ end
10
13
  end
11
14
 
12
15
  class AccessToken < Token
@@ -6,12 +6,17 @@ module FreshJwt
6
6
  REFRESH_EXPIRATION = 60*60*24
7
7
 
8
8
  #Payload.new(extend: val )
9
- option :payload, ->(hash){ Payload.new(exp: FreshJwt::Expiration::ACCESS, extend: hash) }, default: -> { Payload.new } #why we need new i do not understand, coz class is callable
9
+ option :payload, ->(hash){ Payload.new(exp: FreshJwt::Expiration::ACCESS, extend: hash) }, default: -> { Hash.new } #why we need new i do not understand, coz class is callable
10
10
  # TODO: describe enum type for 2 algo
11
11
  option :algorithm, default: -> { 'HS256' } #RS256
12
12
  option :secret, default: -> { 'SECRET' }
13
13
  option :refresh_token, proc(&:to_s), default: -> { SecureRandom.hex }
14
- option :tokens_repo, default: -> { Store }
14
+ option :tokens_repo, ->(instance){ Store::Decorator.new(instance)}, default: -> { Store::Memory.new }
15
+
16
+ #def initialize args, &block
17
+
18
+ # super(args)
19
+ #end
15
20
 
16
21
  def call
17
22
  validate_params params
@@ -19,9 +24,15 @@ module FreshJwt
19
24
  access_token = Entity::AccessToken.new(token: token)
20
25
  refresh_token = Entity::RefreshToken.new(token: refresh_token)
21
26
 
27
+ #yield tokens_repo.transaction do
28
+ # tokens_repo.save access_token
29
+ # tokens_repo.save refresh_toke
30
+ #end
31
+
22
32
  yield tokens_repo.single_transaction access_token
23
33
  yield tokens_repo.single_transaction refresh_token
24
34
 
35
+
25
36
  #result = tokens_repo.transaction do
26
37
  # tokens_repo.save access_token
27
38
  # tokens_repo.save refresh_token
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FreshJwt
4
+ class Refresher
5
+ class TokenExpiredError < StandardError; end
6
+ extend Dry::Initializer
7
+ include Dry::Monads[:result, :do]
8
+ option :repo, default: -> { Store.repo }
9
+
10
+ def call(refresh_token)
11
+ token_object = yield repo.find_by_token refresh_token
12
+ yield expiration_validate token_object
13
+ access_token, refresh_token = Issuer.new.call()
14
+
15
+
16
+ Success([access_token, refresh_token])
17
+ #if token_object
18
+ # Success(token_object)
19
+ #else
20
+ # Failure(error: :token_not_found)
21
+ #end
22
+ #yield validate token
23
+
24
+ end
25
+
26
+ def expiration_validate token_object
27
+ if token_object.expired?
28
+ Failure(error: TokenExpiredError.new)
29
+ else
30
+ Success()
31
+ end
32
+ end
33
+
34
+ def validate token
35
+ Success()
36
+ end
37
+ end
38
+ end
39
+
40
+ #FreshJwt::Store::Manager.repo
41
+
42
+ #FreshJwt::Store::Manager
@@ -1,49 +1,21 @@
1
+ require_relative 'store/mixin'
2
+ require_relative 'store/decorator'
3
+ require_relative 'store/memory'
4
+
1
5
  module FreshJwt
2
- class Store
3
- extend Dry::Monads[:result]
4
- @@store = []
5
- #{
6
- # "token_value": {
7
- # jti: 1,
8
- # exp: 2,
9
- # type: :access
10
- # }
11
- #}
12
6
 
13
- def self.save token
7
+ module Store
8
+
9
+ #require 'singleton'
10
+ @@repo = nil
11
+ def self.repo= repo
12
+ # TODO add check repo needed methods
13
+ @@repo = Store::Decorator.new(repo)
14
14
 
15
- @@store << token
16
- end
17
- def self.get token
18
- @@store.find{ |t| t == token }
19
- end
20
- def self.all
21
- @@store
22
- end
23
-
24
- def self.find_by_token token
25
- @@store.find{ |t| t.token == token }
26
- end
27
-
28
- def self.single_transaction token
29
- begin
30
- save token
31
- return Success()
32
- rescue Exception => error
33
- #puts error
34
- return Failure(error: error.message)
35
- end
36
15
  end
37
16
 
38
- def self.transaction &block
39
- begin
40
- block.call
41
- return Success()
42
- rescue Exception => error
43
-
44
- puts error
45
- return Failure(error: error.message)
46
- end
17
+ def self.repo
18
+ @@repo
47
19
  end
48
20
  end
49
- end
21
+ end
@@ -0,0 +1,55 @@
1
+
2
+ require 'delegate'
3
+ module FreshJwt
4
+ module Store
5
+ class Decorator < SimpleDelegator
6
+
7
+ include Dry::Monads[:result]
8
+ class TokenObjectError < StandardError
9
+ DEFAULT_MESSAGE = 'Token object has wrong structure for Tokens store'
10
+ def initialize(msg = DEFAULT_MESSAGE, exception_type='token')
11
+ @exception_type = exception_type
12
+ super(msg)
13
+ end
14
+ end
15
+
16
+ def single_transaction token, type=:access
17
+ token_object = if type.to_sym == :access
18
+ Entity::AccessToken.new(token: token)
19
+ else
20
+ Entity::RefreshToken.new(token: token)
21
+ end
22
+
23
+ begin
24
+ self.save token_object
25
+ return Success()
26
+ rescue Exception => error
27
+ #puts error
28
+ return Failure(error: error.message)
29
+ end
30
+ end
31
+
32
+ # TODO this method is deprecated
33
+ def save token_object
34
+ #raise StandardError
35
+ unless token_object.respond_to?('token')
36
+ raise TokenObjectError
37
+ end
38
+ super(token_object)
39
+ end
40
+
41
+ def find_by_token token
42
+
43
+ # TODO wrap incoming method to monads
44
+ #return super(token)
45
+ #
46
+ token_object = super(token)
47
+ if token_object
48
+ Success(token_object)
49
+ else
50
+ Failure(error: :token_not_found)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,22 @@
1
+ module FreshJwt
2
+ module Store
3
+ class Memory
4
+ def initialize
5
+ @store = {}
6
+ end
7
+
8
+ def save token_object
9
+ @store[token_object.token] = token_object
10
+ return true
11
+ end
12
+
13
+ def find_by_token token
14
+ if token == 'unknown_token'
15
+ #require 'pry'; binding.pry
16
+ end
17
+ @store[token]
18
+ end
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ module FreshJwt
2
+ module Store
3
+ module Mixin
4
+ include Dry::Monads[:result]
5
+ def single_transaction token
6
+ begin
7
+ self.save token
8
+ return Success()
9
+ rescue Exception => error
10
+ #puts error
11
+ return Failure(error: error.message)
12
+ end
13
+ end
14
+
15
+ def find_by_token token
16
+ # TODO wrap incoming method to monads
17
+ #return super(token)
18
+ if super(token)
19
+ Success(token)
20
+ else
21
+ Failure(error: :token_not_found)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,50 @@
1
+ module FreshJwt
2
+ class StoreOld
3
+ extend Dry::Monads[:result]
4
+ @@store = []
5
+ #{
6
+ # "token_value": {
7
+ # jti: 1,
8
+ # exp: 2,
9
+ # type: :access
10
+ # }
11
+ #}
12
+
13
+ def self.save token
14
+
15
+ @@store << token
16
+ end
17
+ def self.get token
18
+ @@store.find{ |t| t == token }
19
+ end
20
+ def self.all
21
+ @@store
22
+ end
23
+
24
+ def self.find_by_token token
25
+ @@store.find{ |t| t.token == token }
26
+ end
27
+
28
+ def self.single_transaction token
29
+ begin
30
+ save token
31
+ return Success()
32
+ rescue Exception => error
33
+ #puts error
34
+ return Failure(error: error.message)
35
+ end
36
+ end
37
+
38
+ def self.transaction &block
39
+ begin
40
+ block.call
41
+ return Success()
42
+ rescue Exception => error
43
+
44
+ puts error
45
+ return Failure(error: error.message)
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -5,7 +5,7 @@ module FreshJwt
5
5
 
6
6
  option :algorithm, default: -> { 'HS256' }
7
7
  option :secret, default: -> { 'SECRET' }
8
- option :token_repo, default: -> { Store }
8
+ option :token_repo, default: -> { StoreOld }
9
9
 
10
10
  def call(token)
11
11
  yield valid_by_store? token
@@ -1,3 +1,3 @@
1
1
  module FreshJwt
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
data/main.rb CHANGED
@@ -29,7 +29,7 @@ p "decoded " << FreshJwt::Decoder.new().decode(token:token).to_s
29
29
  #p JWT.decode(token, issuer.secret, 'HS256')
30
30
  p "valid? " << FreshJwt::Validator.new().call(token).to_s
31
31
  payload = FreshJwt::Payload.new({})
32
- p "store: #{FreshJwt::Store.all}"
32
+ p "store: #{FreshJwt::StoreOld.all}"
33
33
 
34
34
 
35
35
  ########################################
@@ -12,6 +12,10 @@ RSpec.describe FreshJwt::Issuer do
12
12
  before do
13
13
  allow(SecureRandom).to receive(:hex).and_return(plain_token)
14
14
  end
15
+ it 'SecureRandom always return same value' do
16
+ expect(SecureRandom).to receive(:hex).and_return(plain_token)
17
+ issuer.call
18
+ end
15
19
  it 'should be kind of string' do
16
20
  expect(issuer.call).to be_kind_of Array
17
21
  end
@@ -27,7 +31,8 @@ RSpec.describe FreshJwt::Issuer do
27
31
  #let(:store) { class_double(FreshJwt::Store)}
28
32
  context 'store transaction is failed' do
29
33
  before do
30
- allow(FreshJwt::Store).to receive(:save).and_raise(StandardError)
34
+ allow(issuer.tokens_repo).to receive(:save).and_raise(StandardError)
35
+ #allow(FreshJwt::StoreOld).to receive(:save).and_raise(StandardError)
31
36
  end
32
37
  it 'return empty array' do
33
38
  expect(issuer.call).to be_kind_of(Failure)
@@ -0,0 +1,62 @@
1
+ Struct.new('TokenObject', :token, :expiration)
2
+ include Dry::Monads[:result]
3
+
4
+ RSpec.describe FreshJwt::Store::Memory do
5
+ let(:memory_store) { FreshJwt::Store::Decorator.new(FreshJwt::Store::Memory.new) }
6
+ let(:wrong_token_object) { SecureRandom.hex }
7
+ let(:correct_token_object) { Struct::TokenObject.new('token') }
8
+
9
+ it 'return error when token object incorrect' do
10
+ expect{memory_store.save(wrong_token_object)}.to raise_error(FreshJwt::Store::Decorator::TokenObjectError)
11
+ end
12
+
13
+ it 'return true coz token struct is ok' do
14
+ expect(memory_store.save(correct_token_object)).to be_truthy
15
+ end
16
+
17
+ describe '.find_by_token' do
18
+ before do
19
+ memory_store.save(correct_token_object)
20
+ end
21
+
22
+ it 'return correct token object' do
23
+ expect(memory_store.find_by_token(correct_token_object.token)).to be_success
24
+ end
25
+
26
+ it 'return nil coz token didnt save before' do
27
+ expect(memory_store.find_by_token(SecureRandom.hex)).to be_failure
28
+ end
29
+ end
30
+
31
+ =begin
32
+ # TODO: remove it coz mixin do not use anymore
33
+ describe 'single_transaction mixin' do
34
+ before do
35
+ memory_store.class.send(:include, FreshJwt::Store::Mixin)
36
+ end
37
+ it 'returns Success monad' do
38
+ expect(memory_store.single_transaction(correct_token_object)).to be_kind_of(Success)
39
+ end
40
+
41
+ xit 'can find token after save via single transaction' do
42
+ #require 'pry'; binding.pry
43
+ memory_store.single_transaction(correct_token_object)
44
+ expect(memory_store.find_by_token(correct_token_object.token).value!).to eq(correct_token_object.token)
45
+ end
46
+ end
47
+ =end
48
+ #it_behaves_like 'single_transaction mixin'
49
+
50
+ describe 'use delegator for Decorate Store' do
51
+ let(:memory_store_decorated) { FreshJwt::Store::Decorator.new(FreshJwt::Store::Memory.new) }
52
+
53
+ it 'returns Success monad' do
54
+ expect(memory_store_decorated.single_transaction(correct_token_object.token)).to be_kind_of(Success)
55
+ end
56
+
57
+ it 'can find token after save via single transaction' do
58
+ memory_store_decorated.single_transaction(correct_token_object.token)
59
+ expect(memory_store_decorated.find_by_token(correct_token_object.token).value!.token).to eq(correct_token_object.token)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ # кажется причина ошибок в спеках в том, что Memory obj шарится в разных местах
3
+ # нужно видимо делать instance_double()
4
+ include Dry::Monads[:result]
5
+ RSpec.describe FreshJwt::Refresher do
6
+ let(:unknown_token) { 'unknown_token' }
7
+ let(:token) { SecureRandom.uuid }
8
+
9
+ let(:repo) { FreshJwt::Store::Memory.new }
10
+ #subject(:refresher) { }
11
+ before do
12
+ FreshJwt::Store.repo = repo
13
+ FreshJwt::Store.repo.single_transaction token
14
+ end
15
+
16
+
17
+ context 'when add token to store' do
18
+ it 'retuns success with token' do
19
+ expect(described_class.new.call(token)).to be_success
20
+ end
21
+
22
+ #TODO: add shared example for checking new issued access & refresh tokens pair
23
+ it 'retuns access & refresh tokens pair' do
24
+ expect(described_class.new.call(token).value!.size).to eq(2)
25
+ end
26
+
27
+
28
+ end
29
+
30
+ context 'when invalid by differents reason' do
31
+ let(:subject) {described_class.new.call(token)}
32
+ before do
33
+ t = Time.at( Time.now.to_i + FreshJwt::Expiration::ACCESS + 1 )
34
+ Timecop.travel(t)
35
+ end
36
+
37
+ it 'have not found a token' do
38
+ expect(described_class.new.call(unknown_token)).to be_failure
39
+ end
40
+
41
+ it 'should return failure object coz token has expire' do
42
+ expect(subject).to be_failure
43
+ end
44
+
45
+ it 'should return concrete error coz token has expire' do
46
+ expect(subject.failure).to eq(error: described_class::TokenExpiredError.new)
47
+ end
48
+
49
+
50
+
51
+ end
52
+
53
+
54
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe FreshJwt::Store do
4
+ let(:repo) { FreshJwt::Store::Memory.new }
5
+ before do
6
+ described_class.repo = repo
7
+ end
8
+ it 'return correct repo' do
9
+ expect(described_class.repo).to eq(repo)
10
+ end
11
+
12
+ it 'reponds true for repo.save call' do
13
+ expect(described_class.repo.respond_to?(:save)).to eq(true)
14
+ end
15
+
16
+ it 'reponds true for repo.find_by_token' do
17
+ expect(described_class.repo.respond_to?(:find_by_token)).to eq(true)
18
+ end
19
+
20
+ it 'reponds true for repo.single_transaction' do
21
+ expect(described_class.repo.respond_to?(:single_transaction)).to eq(true)
22
+ end
23
+ end
@@ -1,6 +1,6 @@
1
1
  Struct.new('AccessToken', :token)
2
2
 
3
- RSpec.describe FreshJwt::Store do
3
+ RSpec.describe FreshJwt::StoreOld do
4
4
  let(:token) { SecureRandom.hex }
5
5
  let(:unknown_token) { SecureRandom.hex }
6
6
  let(:token_obj) { Struct::AccessToken.new(token) }
@@ -3,10 +3,34 @@
3
3
  RSpec.describe FreshJwt::Entity::AccessToken do
4
4
  let(:token) { SecureRandom.hex }
5
5
  let(:access_token) { FreshJwt::Entity::AccessToken.new(token: token) }
6
+ let(:refresh_token) { FreshJwt::Entity::RefreshToken.new(token: token) }
7
+
6
8
  before do
7
9
 
8
10
  end
9
11
  it 'create access token klass' do
10
12
  expect(access_token.name).to eq('AccessToken')
11
13
  end
14
+
15
+ it 'return false coz access not expire' do
16
+ expect(access_token.expired?).to be_falsey
17
+ end
18
+ it 'return false coz refresh not expire' do
19
+ expect(refresh_token.expired?).to be_falsey
20
+ end
21
+
22
+ context 'when future time & token has expired' do
23
+ before do
24
+ access_token
25
+ refresh_token
26
+ future_time = Time.now.to_i + FreshJwt::Expiration::REFRESH + 1
27
+ Timecop.travel(Time.at(future_time))
28
+ end
29
+ it 'return true coz access expired' do
30
+ expect(access_token.expired?).to be_truthy
31
+ end
32
+ it 'return true coz refresh expired' do
33
+ expect(refresh_token.expired?).to be_truthy
34
+ end
35
+ end
12
36
  end
data/spec/spec_helper.rb CHANGED
@@ -16,6 +16,10 @@
16
16
 
17
17
  require_relative '../lib/fresh_jwt'
18
18
  require 'timecop'
19
+
20
+ require 'simplecov'
21
+ SimpleCov.start
22
+
19
23
  RSpec.configure do |config|
20
24
  # rspec-expectations config goes here. You can use an alternate
21
25
  # assertion/expectation library such as wrong or the stdlib/minitest
metadata CHANGED
@@ -1,15 +1,127 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fresh_jwt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrei Mosin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-19 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-06-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jwt
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.2.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.2.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-initializer
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dry-monads
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: dry-validation
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.6'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.14'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.14'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.10'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.10'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.22'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.22'
111
+ - !ruby/object:Gem::Dependency
112
+ name: timecop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.9'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.9'
13
125
  description: Issue access JWT & secure with refresh token
14
126
  email: otmosina@gmail.com
15
127
  executables: []
@@ -22,6 +134,7 @@ files:
22
134
  - Gemfile.lock
23
135
  - README.md
24
136
  - bin/console
137
+ - fresh_jwt.gemspec
25
138
  - lib/contracts/issuer_contract.rb
26
139
  - lib/fresh_jwt.rb
27
140
  - lib/fresh_jwt/contract_validator.rb
@@ -29,18 +142,26 @@ files:
29
142
  - lib/fresh_jwt/expiration.rb
30
143
  - lib/fresh_jwt/issuer.rb
31
144
  - lib/fresh_jwt/payload.rb
145
+ - lib/fresh_jwt/refresher.rb
32
146
  - lib/fresh_jwt/store.rb
147
+ - lib/fresh_jwt/store/decorator.rb
148
+ - lib/fresh_jwt/store/memory.rb
149
+ - lib/fresh_jwt/store/mixin.rb
150
+ - lib/fresh_jwt/store_old.rb
33
151
  - lib/fresh_jwt/validator.rb
34
152
  - lib/fresh_jwt/version.rb
35
153
  - main.rb
36
154
  - refresher_draft.rb
37
155
  - spec/fresh_jwt/issuer_spec.rb
38
- - spec/fresh_jwt/store_spec.rb
156
+ - spec/fresh_jwt/memory_spec.rb
157
+ - spec/fresh_jwt/refresher_spec.rb
158
+ - spec/fresh_jwt/store/store_spec.rb
159
+ - spec/fresh_jwt/store_old_spec.rb
39
160
  - spec/fresh_jwt/token_spec.rb
40
161
  - spec/fresh_jwt/validator_spec.rb
41
162
  - spec/fresh_jwt_spec.rb
42
163
  - spec/spec_helper.rb
43
- homepage: https://rubygems.org/gems/hola
164
+ homepage: https://rubygems.org/gems/fresh_jwt
44
165
  licenses:
45
166
  - MIT
46
167
  metadata: {}
@@ -52,7 +173,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
52
173
  requirements:
53
174
  - - ">="
54
175
  - !ruby/object:Gem::Version
55
- version: '0'
176
+ version: 2.7.3
56
177
  required_rubygems_version: !ruby/object:Gem::Requirement
57
178
  requirements:
58
179
  - - ">="
@@ -65,7 +186,10 @@ specification_version: 4
65
186
  summary: Fresh JWT token!
66
187
  test_files:
67
188
  - spec/fresh_jwt/issuer_spec.rb
68
- - spec/fresh_jwt/store_spec.rb
189
+ - spec/fresh_jwt/memory_spec.rb
190
+ - spec/fresh_jwt/refresher_spec.rb
191
+ - spec/fresh_jwt/store/store_spec.rb
192
+ - spec/fresh_jwt/store_old_spec.rb
69
193
  - spec/fresh_jwt/token_spec.rb
70
194
  - spec/fresh_jwt/validator_spec.rb
71
195
  - spec/fresh_jwt_spec.rb