jwt_keeper 3.0.1 → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +12 -7
- data/Gemfile +2 -0
- data/README.md +4 -1
- data/Rakefile +2 -0
- data/jwt_keeper.gemspec +6 -6
- data/lib/generators/templates/jwt_keeper.rb +5 -0
- data/lib/jwt_keeper.rb +0 -2
- data/lib/jwt_keeper/controller.rb +11 -6
- data/lib/jwt_keeper/datastore.rb +18 -2
- data/lib/jwt_keeper/engine.rb +1 -2
- data/lib/jwt_keeper/token.rb +17 -5
- data/lib/jwt_keeper/version.rb +1 -1
- data/spec/lib/jwt_keeper/controller_spec.rb +1 -1
- data/spec/lib/jwt_keeper/token_spec.rb +23 -9
- data/spec/spec_helper.rb +6 -8
- metadata +32 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 26a338e78f6af549348419350f802cb0eea3afead33d967eef694d2e45850faf
|
4
|
+
data.tar.gz: '081c9b805dd36d5a2650faa693ad73b54583a132827fdf490a349c970482f0f5'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7168ef5c0ad904a0cedf95da5b9a2e934e322af10327637bde820298ea21209f4c62104f05a2e6153d6a498aa715340a926d294e6d0d7302f67b559112e600c
|
7
|
+
data.tar.gz: d94f5e45932d679718e5ee5e6d810fa6c4ea3fe037f5bad3629a9719b7d748da7a62d54ed1782715f84e50a85e5bbc5f96ca20211ace602442bd124f1ca6f8d6
|
data/.travis.yml
CHANGED
@@ -1,21 +1,26 @@
|
|
1
1
|
language: ruby
|
2
2
|
cache: bundler
|
3
3
|
rvm:
|
4
|
-
- 2.
|
5
|
-
- 2.
|
6
|
-
- 2.
|
7
|
-
- 2.3.0
|
4
|
+
- 2.4.5
|
5
|
+
- 2.5.3
|
6
|
+
- 2.6.1
|
8
7
|
- ruby-head
|
9
8
|
matrix:
|
10
9
|
allow_failures:
|
11
10
|
- rvm: ruby-head
|
12
|
-
addons:
|
13
|
-
code_climate:
|
14
|
-
repo_token: f69bb189f348c1d7992d8ed8690d0a2c9c885c1aac45e2f4d48732034592b37b
|
15
11
|
services:
|
16
12
|
- redis-server
|
17
13
|
env:
|
18
14
|
global:
|
19
15
|
- REDIS_URL=redis://localhost:6379
|
16
|
+
- CC_TEST_REPORTER_ID=f69bb189f348c1d7992d8ed8690d0a2c9c885c1aac45e2f4d48732034592b37b
|
17
|
+
before_script:
|
18
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
19
|
+
- chmod +x ./cc-test-reporter
|
20
|
+
- ./cc-test-reporter before-build
|
21
|
+
script:
|
22
|
+
- bundle exec rspec
|
23
|
+
after_script:
|
24
|
+
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
20
25
|
notifications:
|
21
26
|
email: false
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# JWT Keeper
|
2
|
+
[![Gem Version](https://img.shields.io/gem/v/jwt_keeper.svg?maxAge=2592000)](https://rubygems.org/gems/jwt_keeper)
|
2
3
|
[![Build Status](https://img.shields.io/travis/sirwolfgang/jwt_keeper/master.svg)](https://travis-ci.org/sirwolfgang/jwt_keeper)
|
3
4
|
[![Dependency Status](https://img.shields.io/gemnasium/sirwolfgang/jwt_keeper.svg)](https://gemnasium.com/sirwolfgang/jwt_keeper)
|
4
5
|
[![Code Climate](https://img.shields.io/codeclimate/github/sirwolfgang/jwt_keeper.svg)](https://codeclimate.com/github/sirwolfgang/jwt_keeper)
|
@@ -31,11 +32,13 @@ raw_token_string = token.to_jwt
|
|
31
32
|
The designed rails token flow is to receive and respond to requests with the token being present in the `Authorization` part of the header. This is to allow us to seamlessly rotate the tokens on the fly without having to rebuff the request as part of the user flow. Automatic rotation happens as part of the `require_authentication` action, meaning that you will always get the latest token data as created by `generate_claims` in your controllers. This new token is added to the response with the `write_authentication_token` action.
|
32
33
|
|
33
34
|
```bash
|
34
|
-
|
35
|
+
rails generate jwt_keeper:install
|
35
36
|
```
|
36
37
|
|
37
38
|
```ruby
|
38
39
|
class ApplicationController < ActionController::Base
|
40
|
+
include JWTKeeper::Controller
|
41
|
+
|
39
42
|
before_action :require_authentication
|
40
43
|
|
41
44
|
def not_authenticated
|
data/Rakefile
CHANGED
data/jwt_keeper.gemspec
CHANGED
@@ -23,14 +23,14 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency 'yard'
|
24
24
|
spec.add_development_dependency 'rubocop'
|
25
25
|
spec.add_development_dependency 'dotenv'
|
26
|
+
spec.add_development_dependency 'pry'
|
26
27
|
|
27
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
28
|
+
spec.add_development_dependency 'rspec', '~> 3.8'
|
28
29
|
spec.add_development_dependency 'fuubar'
|
29
30
|
spec.add_development_dependency 'simplecov'
|
30
|
-
spec.add_development_dependency 'codeclimate-test-reporter'
|
31
31
|
|
32
|
-
spec.add_dependency 'redis'
|
33
|
-
spec.add_dependency 'rails'
|
34
|
-
spec.add_dependency 'activesupport'
|
35
|
-
spec.add_dependency 'jwt', '
|
32
|
+
spec.add_dependency 'redis'
|
33
|
+
spec.add_dependency 'rails'
|
34
|
+
spec.add_dependency 'activesupport'
|
35
|
+
spec.add_dependency 'jwt', '>= 1.5'
|
36
36
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
JWTKeeper.configure do |config|
|
2
4
|
# The time to expire for the tokens
|
3
5
|
# config.expiry = 1.hour
|
@@ -26,6 +28,9 @@ JWTKeeper.configure do |config|
|
|
26
28
|
|
27
29
|
# the location of redis config file
|
28
30
|
# config.redis_connection = Redis.new(connection_options)
|
31
|
+
# config.redis_connection = ConnectionPool.new(size: ENV.fetch('RAILS_MAX_THREADS', 5)) do
|
32
|
+
# Redis.new(url: ENV['REDISCLOUD_URL'] || 'redis://localhost:6379/')
|
33
|
+
# end
|
29
34
|
|
30
35
|
# A unique idenfitier for the token version.
|
31
36
|
# config.version = 1
|
data/lib/jwt_keeper.rb
CHANGED
@@ -2,11 +2,9 @@ module JWTKeeper
|
|
2
2
|
module Controller
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
-
module ClassMethods
|
6
|
-
end
|
7
|
-
|
8
5
|
# Available to be used as a before_action by the application's controllers. This is
|
9
6
|
# the main logical section for decoding, and automatically rotating tokens
|
7
|
+
# @return [void]
|
10
8
|
def require_authentication
|
11
9
|
token = read_authentication_token
|
12
10
|
|
@@ -25,44 +23,51 @@ module JWTKeeper
|
|
25
23
|
end
|
26
24
|
|
27
25
|
# Decodes and returns the token
|
26
|
+
# @return [Token] the token read from request
|
28
27
|
def read_authentication_token
|
29
28
|
return nil unless request.headers['Authorization']
|
30
29
|
@authentication_token ||=
|
31
30
|
JWTKeeper::Token.find(
|
32
31
|
request.headers['Authorization'].split.last,
|
33
|
-
cookies.signed['jwt_keeper']
|
32
|
+
defined?(cookies) && cookies.signed['jwt_keeper']
|
34
33
|
)
|
35
34
|
end
|
36
35
|
|
37
36
|
# Encodes and writes the token
|
37
|
+
# @param token [Token] The token to be written
|
38
|
+
# @return [Token] the token written to response
|
38
39
|
def write_authentication_token(token)
|
39
40
|
return clear_authentication_token if token.nil?
|
40
41
|
response.headers['Authorization'] = "Bearer #{token.to_jwt}"
|
41
|
-
cookies.signed['jwt_keeper'] = token.to_cookie
|
42
|
+
defined?(cookies) && cookies.signed['jwt_keeper'] = token.to_cookie
|
42
43
|
@authentication_token = token
|
43
44
|
end
|
44
45
|
|
45
46
|
# delets the authentication token
|
47
|
+
# @return [void]
|
46
48
|
def clear_authentication_token
|
47
49
|
response.headers['Authorization'] = nil
|
48
|
-
cookies.delete('jwt_keeper')
|
50
|
+
defined?(cookies) && cookies.delete('jwt_keeper')
|
49
51
|
@authentication_token = nil
|
50
52
|
end
|
51
53
|
|
52
54
|
# The default action for denying non-authenticated connections.
|
53
55
|
# You can override this method in your controllers
|
56
|
+
# @return [void]
|
54
57
|
def not_authenticated
|
55
58
|
redirect_to root_path
|
56
59
|
end
|
57
60
|
|
58
61
|
# The default action for accepting authenticated connections.
|
59
62
|
# You can override this method in your controllers
|
63
|
+
# @return [void]
|
60
64
|
def authenticated(token)
|
61
65
|
end
|
62
66
|
|
63
67
|
# Invoked by the require_authentication method as part of the automatic rotation
|
64
68
|
# process. The application should override this method to include the necessary
|
65
69
|
# claims.
|
70
|
+
# @return [void]
|
66
71
|
def regenerate_claims(old_token)
|
67
72
|
end
|
68
73
|
end
|
data/lib/jwt_keeper/datastore.rb
CHANGED
@@ -27,12 +27,28 @@ module JWTKeeper
|
|
27
27
|
|
28
28
|
# @!visibility private
|
29
29
|
def set_with_expiry(jti, seconds, type)
|
30
|
-
JWTKeeper.configuration.redis_connection
|
30
|
+
redis = JWTKeeper.configuration.redis_connection
|
31
|
+
|
32
|
+
if redis.is_a?(Redis)
|
33
|
+
redis.setex(jti, seconds, type)
|
34
|
+
elsif defined?(ConnectionPool) && redis.is_a?(ConnectionPool)
|
35
|
+
redis.with { |conn| conn.setex(jti, seconds, type) }
|
36
|
+
else
|
37
|
+
throw 'Bad Redis Connection'
|
38
|
+
end
|
31
39
|
end
|
32
40
|
|
33
41
|
# @!visibility private
|
34
42
|
def get(jti)
|
35
|
-
JWTKeeper.configuration.redis_connection
|
43
|
+
redis = JWTKeeper.configuration.redis_connection
|
44
|
+
|
45
|
+
if redis.is_a?(Redis)
|
46
|
+
redis.get(jti)
|
47
|
+
elsif defined?(ConnectionPool) && redis.is_a?(ConnectionPool)
|
48
|
+
redis.with { |conn| conn.get(jti) }
|
49
|
+
else
|
50
|
+
throw 'Bad Redis Connection'
|
51
|
+
end
|
36
52
|
end
|
37
53
|
end
|
38
54
|
end
|
data/lib/jwt_keeper/engine.rb
CHANGED
@@ -2,8 +2,7 @@ require 'jwt_keeper'
|
|
2
2
|
require 'rails'
|
3
3
|
|
4
4
|
module JWTKeeper
|
5
|
-
#
|
6
|
-
# With the plugin logic.
|
5
|
+
# Includes JWTKeeper into ActionController
|
7
6
|
class Engine < ::Rails::Engine
|
8
7
|
initializer 'extend Controller with jwt_keeper' do |_app|
|
9
8
|
ActionController::Base.send(:include, JWTKeeper::Controller)
|
data/lib/jwt_keeper/token.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
module JWTKeeper
|
2
|
+
# This class acts as the main interface to wrap the concerns of JWTs. Handling everything from
|
3
|
+
# encoding to invalidation.
|
2
4
|
class Token
|
3
5
|
attr_accessor :claims, :cookie_secret
|
4
6
|
|
5
7
|
# Initalizes a new web token
|
6
8
|
# @param private_claims [Hash] the custom claims to encode
|
9
|
+
# @param cookie_secret [String] the cookie secret to use during encoding
|
10
|
+
# @return [void]
|
7
11
|
def initialize(private_claims = {}, cookie_secret = nil)
|
8
12
|
@cookie_secret = cookie_secret
|
9
13
|
@claims = {
|
@@ -11,8 +15,10 @@ module JWTKeeper
|
|
11
15
|
iat: DateTime.now.to_i, # issued at
|
12
16
|
jti: SecureRandom.uuid # JWT ID
|
13
17
|
}
|
18
|
+
|
14
19
|
@claims.merge!(JWTKeeper.configuration.base_claims)
|
15
20
|
@claims.merge!(private_claims)
|
21
|
+
@claims[:exp] = @claims[:exp].to_i if @claims[:exp].is_a?(Time)
|
16
22
|
end
|
17
23
|
|
18
24
|
# Creates a new web token
|
@@ -25,12 +31,15 @@ module JWTKeeper
|
|
25
31
|
|
26
32
|
# Decodes and validates an existing token
|
27
33
|
# @param raw_token [String] the raw token
|
34
|
+
# @param cookie_secret [String] the cookie secret
|
28
35
|
# @return [Token] token object
|
29
36
|
def self.find(raw_token, cookie_secret = nil)
|
30
37
|
claims = decode(raw_token, cookie_secret)
|
31
38
|
return nil if claims.nil?
|
32
39
|
|
33
|
-
new_token = new(
|
40
|
+
new_token = new({}, cookie_secret)
|
41
|
+
new_token.claims = claims
|
42
|
+
|
34
43
|
return nil if new_token.revoked?
|
35
44
|
new_token
|
36
45
|
end
|
@@ -39,12 +48,14 @@ module JWTKeeper
|
|
39
48
|
# is inherently ignored by the token's exp check and then rewritten with the revokation on
|
40
49
|
# rotate.
|
41
50
|
# @param token_jti [String] the token unique id
|
51
|
+
# @return [void]
|
42
52
|
def self.rotate(token_jti)
|
43
53
|
Datastore.rotate(token_jti, JWTKeeper.configuration.expiry.from_now.to_i)
|
44
54
|
end
|
45
55
|
|
46
56
|
# Revokes a web token
|
47
57
|
# @param token_jti [String] the token unique id
|
58
|
+
# @return [void]
|
48
59
|
def self.revoke(token_jti)
|
49
60
|
Datastore.revoke(token_jti, JWTKeeper.configuration.expiry.from_now.to_i)
|
50
61
|
end
|
@@ -57,7 +68,7 @@ module JWTKeeper
|
|
57
68
|
|
58
69
|
# Revokes and creates a new web token
|
59
70
|
# @param new_claims [Hash] Used to override and update claims during rotation
|
60
|
-
# @return [
|
71
|
+
# @return [Token]
|
61
72
|
def rotate(new_claims = nil)
|
62
73
|
revoke
|
63
74
|
|
@@ -70,6 +81,7 @@ module JWTKeeper
|
|
70
81
|
end
|
71
82
|
|
72
83
|
# Revokes a web token
|
84
|
+
# @return [void]
|
73
85
|
def revoke
|
74
86
|
return if invalid?
|
75
87
|
Datastore.revoke(id, claims[:exp] - DateTime.now.to_i)
|
@@ -106,14 +118,14 @@ module JWTKeeper
|
|
106
118
|
end
|
107
119
|
|
108
120
|
# Encodes the jwt
|
109
|
-
# @return [String]
|
121
|
+
# @return [String] the encoded jwt
|
110
122
|
def to_jwt
|
111
123
|
encode
|
112
124
|
end
|
113
125
|
alias to_s to_jwt
|
114
126
|
|
115
127
|
# Encodes the cookie
|
116
|
-
# @return [Hash]
|
128
|
+
# @return [Hash] the cookie options
|
117
129
|
def to_cookie
|
118
130
|
{
|
119
131
|
value: cookie_secret,
|
@@ -143,7 +155,7 @@ module JWTKeeper
|
|
143
155
|
|
144
156
|
# @!visibility private
|
145
157
|
def encode
|
146
|
-
JWT.encode(claims,
|
158
|
+
JWT.encode(claims.compact,
|
147
159
|
JWTKeeper.configuration.secret.to_s + cookie_secret.to_s,
|
148
160
|
JWTKeeper.configuration.algorithm
|
149
161
|
)
|
data/lib/jwt_keeper/version.rb
CHANGED
@@ -4,7 +4,7 @@ RSpec.describe JWTKeeper do
|
|
4
4
|
describe 'Controller' do
|
5
5
|
include_context 'initialize config'
|
6
6
|
|
7
|
-
let(:token) { JWTKeeper::Token.create(claim: "
|
7
|
+
let(:token) { JWTKeeper::Token.create(claim: "The Earth is Flat") }
|
8
8
|
subject(:test_controller) do
|
9
9
|
cookies_klass = Class.new(Hash) do
|
10
10
|
def signed
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
module JWTKeeper
|
4
4
|
RSpec.describe Token do
|
5
5
|
include_context 'initialize config'
|
6
|
-
let(:private_claims) { { claim: "
|
6
|
+
let(:private_claims) { { claim: "The Earth is Flat" } }
|
7
7
|
let(:token) { described_class.create(private_claims) }
|
8
8
|
let(:raw_token) { token.to_jwt }
|
9
9
|
|
@@ -17,6 +17,13 @@ module JWTKeeper
|
|
17
17
|
before { JWTKeeper.configure(JWTKeeper::Configuration.new(config.merge(cookie_lock: true))) }
|
18
18
|
it { expect(subject.cookie_secret).not_to be_empty }
|
19
19
|
end
|
20
|
+
|
21
|
+
context 'when overiding default claims' do
|
22
|
+
let(:private_claims) { { exp: 1.minute.from_now.to_i } }
|
23
|
+
|
24
|
+
it { is_expected.to be_instance_of described_class }
|
25
|
+
it { expect(subject.claims[:exp]).to eql private_claims[:exp] }
|
26
|
+
end
|
20
27
|
end
|
21
28
|
|
22
29
|
describe '.find' do
|
@@ -35,16 +42,23 @@ module JWTKeeper
|
|
35
42
|
it { is_expected.to be nil }
|
36
43
|
end
|
37
44
|
|
38
|
-
context 'with
|
39
|
-
subject { described_class.find(raw_token, 'BAD_COOKIE') }
|
40
|
-
it { is_expected.to be nil }
|
41
|
-
end
|
42
|
-
|
43
|
-
context 'with valid cookie' do
|
45
|
+
context 'describe with cookie locking' do
|
44
46
|
before { JWTKeeper.configure(JWTKeeper::Configuration.new(config.merge(cookie_lock: true))) }
|
45
|
-
subject { described_class.find(raw_token, token.cookie_secret) }
|
46
47
|
|
47
|
-
|
48
|
+
context 'with no cookie' do
|
49
|
+
subject { described_class.find(raw_token, nil) }
|
50
|
+
it { is_expected.to be nil }
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'with bad cookie' do
|
54
|
+
subject { described_class.find(raw_token, 'BAD_COOKIE') }
|
55
|
+
it { is_expected.to be nil }
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'with valid cookie' do
|
59
|
+
subject { described_class.find(raw_token, token.cookie_secret) }
|
60
|
+
it { is_expected.to be_instance_of described_class }
|
61
|
+
end
|
48
62
|
end
|
49
63
|
end
|
50
64
|
|
data/spec/spec_helper.rb
CHANGED
@@ -1,15 +1,13 @@
|
|
1
|
+
require 'pry'
|
1
2
|
require 'dotenv'
|
2
3
|
Dotenv.load
|
3
4
|
|
4
5
|
require 'simplecov'
|
5
|
-
|
6
|
-
|
7
|
-
SimpleCov.
|
8
|
-
|
9
|
-
|
10
|
-
CodeClimate::TestReporter::Formatter
|
11
|
-
])
|
12
|
-
SimpleCov.start
|
6
|
+
|
7
|
+
SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
|
8
|
+
SimpleCov.start do
|
9
|
+
add_filter '/spec/'
|
10
|
+
end
|
13
11
|
|
14
12
|
require 'rails'
|
15
13
|
require 'jwt_keeper'
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jwt_keeper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Rivera
|
8
8
|
- Zane Wolfgang Pickett
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-02-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -82,35 +82,35 @@ dependencies:
|
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
|
-
name:
|
85
|
+
name: pry
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- - "
|
88
|
+
- - ">="
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version: '
|
90
|
+
version: '0'
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- - "
|
95
|
+
- - ">="
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version: '
|
97
|
+
version: '0'
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
|
-
name:
|
99
|
+
name: rspec
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- - "
|
102
|
+
- - "~>"
|
103
103
|
- !ruby/object:Gem::Version
|
104
|
-
version: '
|
104
|
+
version: '3.8'
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
|
-
- - "
|
109
|
+
- - "~>"
|
110
110
|
- !ruby/object:Gem::Version
|
111
|
-
version: '
|
111
|
+
version: '3.8'
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
|
-
name:
|
113
|
+
name: fuubar
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
116
|
- - ">="
|
@@ -124,7 +124,7 @@ dependencies:
|
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '0'
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
|
-
name:
|
127
|
+
name: simplecov
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
129
129
|
requirements:
|
130
130
|
- - ">="
|
@@ -141,56 +141,56 @@ dependencies:
|
|
141
141
|
name: redis
|
142
142
|
requirement: !ruby/object:Gem::Requirement
|
143
143
|
requirements:
|
144
|
-
- - "
|
144
|
+
- - ">="
|
145
145
|
- !ruby/object:Gem::Version
|
146
|
-
version: '
|
146
|
+
version: '0'
|
147
147
|
type: :runtime
|
148
148
|
prerelease: false
|
149
149
|
version_requirements: !ruby/object:Gem::Requirement
|
150
150
|
requirements:
|
151
|
-
- - "
|
151
|
+
- - ">="
|
152
152
|
- !ruby/object:Gem::Version
|
153
|
-
version: '
|
153
|
+
version: '0'
|
154
154
|
- !ruby/object:Gem::Dependency
|
155
155
|
name: rails
|
156
156
|
requirement: !ruby/object:Gem::Requirement
|
157
157
|
requirements:
|
158
|
-
- - "
|
158
|
+
- - ">="
|
159
159
|
- !ruby/object:Gem::Version
|
160
|
-
version: '
|
160
|
+
version: '0'
|
161
161
|
type: :runtime
|
162
162
|
prerelease: false
|
163
163
|
version_requirements: !ruby/object:Gem::Requirement
|
164
164
|
requirements:
|
165
|
-
- - "
|
165
|
+
- - ">="
|
166
166
|
- !ruby/object:Gem::Version
|
167
|
-
version: '
|
167
|
+
version: '0'
|
168
168
|
- !ruby/object:Gem::Dependency
|
169
169
|
name: activesupport
|
170
170
|
requirement: !ruby/object:Gem::Requirement
|
171
171
|
requirements:
|
172
|
-
- - "
|
172
|
+
- - ">="
|
173
173
|
- !ruby/object:Gem::Version
|
174
|
-
version: '
|
174
|
+
version: '0'
|
175
175
|
type: :runtime
|
176
176
|
prerelease: false
|
177
177
|
version_requirements: !ruby/object:Gem::Requirement
|
178
178
|
requirements:
|
179
|
-
- - "
|
179
|
+
- - ">="
|
180
180
|
- !ruby/object:Gem::Version
|
181
|
-
version: '
|
181
|
+
version: '0'
|
182
182
|
- !ruby/object:Gem::Dependency
|
183
183
|
name: jwt
|
184
184
|
requirement: !ruby/object:Gem::Requirement
|
185
185
|
requirements:
|
186
|
-
- - "
|
186
|
+
- - ">="
|
187
187
|
- !ruby/object:Gem::Version
|
188
188
|
version: '1.5'
|
189
189
|
type: :runtime
|
190
190
|
prerelease: false
|
191
191
|
version_requirements: !ruby/object:Gem::Requirement
|
192
192
|
requirements:
|
193
|
-
- - "
|
193
|
+
- - ">="
|
194
194
|
- !ruby/object:Gem::Version
|
195
195
|
version: '1.5'
|
196
196
|
description: A managing interface layer for handling the creation and validation of
|
@@ -234,7 +234,7 @@ homepage: https://github.com/sirwolfgang/jwt_keeper
|
|
234
234
|
licenses:
|
235
235
|
- MIT
|
236
236
|
metadata: {}
|
237
|
-
post_install_message:
|
237
|
+
post_install_message:
|
238
238
|
rdoc_options: []
|
239
239
|
require_paths:
|
240
240
|
- lib
|
@@ -249,9 +249,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
249
|
- !ruby/object:Gem::Version
|
250
250
|
version: '0'
|
251
251
|
requirements: []
|
252
|
-
|
253
|
-
|
254
|
-
signing_key:
|
252
|
+
rubygems_version: 3.2.3
|
253
|
+
signing_key:
|
255
254
|
specification_version: 4
|
256
255
|
summary: JWT for Rails made easy
|
257
256
|
test_files:
|
@@ -261,4 +260,3 @@ test_files:
|
|
261
260
|
- spec/lib/jwt_keeper/token_spec.rb
|
262
261
|
- spec/lib/jwt_keeper_spec.rb
|
263
262
|
- spec/spec_helper.rb
|
264
|
-
has_rdoc:
|