jwt_sessions 2.3.0 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +41 -41
- data/lib/jwt_sessions/access_token.rb +4 -4
- data/lib/jwt_sessions/authorization.rb +8 -8
- data/lib/jwt_sessions/refresh_token.rb +2 -2
- data/lib/jwt_sessions/session.rb +7 -7
- data/lib/jwt_sessions/store_adapters/memory_store_adapter.rb +10 -10
- data/lib/jwt_sessions/store_adapters/redis_store_adapter.rb +6 -6
- data/lib/jwt_sessions/token.rb +4 -4
- data/lib/jwt_sessions/version.rb +1 -1
- data/lib/jwt_sessions.rb +25 -25
- data/test/units/jwt_sessions/store_adapters/test_memory_store_adapter.rb +46 -46
- data/test/units/jwt_sessions/store_adapters/test_redis_store_adapter.rb +23 -23
- data/test/units/jwt_sessions/test_access_token.rb +3 -3
- data/test/units/jwt_sessions/test_csrf_token.rb +4 -4
- data/test/units/jwt_sessions/test_refresh_token.rb +3 -3
- data/test/units/jwt_sessions/test_session.rb +35 -24
- data/test/units/jwt_sessions/test_token.rb +48 -48
- data/test/units/test_jwt_sessions.rb +6 -6
- data/test/units/test_token_store.rb +7 -7
- metadata +4 -4
@@ -1,120 +1,120 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "jwt_sessions"
|
5
|
+
require "pry"
|
6
6
|
|
7
7
|
nacl_supported_versions = {
|
8
|
-
|
9
|
-
|
8
|
+
"ruby" => ["~> 2.2.6", "~> 2.3.0", "~> 2.4.2"],
|
9
|
+
"jruby" => ["~> 9.1.6.0"]
|
10
10
|
}.each_with_object([]) do |(platform, versions), acc|
|
11
11
|
acc.concat(versions.map { |version| Gem::Dependency.new(platform, version) })
|
12
12
|
end
|
13
13
|
|
14
14
|
nacl_supported = nacl_supported_versions.any? { |version| version.match?(RUBY_ENGINE, RUBY_VERSION) }
|
15
15
|
|
16
|
-
$uses_nacl = !!(defined?(RbNaCl) || require(
|
16
|
+
$uses_nacl = !!(defined?(RbNaCl) || require("rbnacl") if nacl_supported)
|
17
17
|
|
18
18
|
class TestToken < Minitest::Test
|
19
19
|
attr_reader :payload
|
20
20
|
|
21
21
|
def setup
|
22
|
-
@payload = {
|
23
|
-
JWTSessions.encryption_key =
|
22
|
+
@payload = { "user_id" => 1, "secret" => "mystery" }
|
23
|
+
JWTSessions.encryption_key = "abcdefghijklmnopqrstuvwxyzABCDEF"
|
24
24
|
end
|
25
25
|
|
26
26
|
def teardown
|
27
27
|
JWTSessions.algorithm = JWTSessions::DEFAULT_ALGORITHM
|
28
|
-
JWTSessions.instance_variable_set(:
|
28
|
+
JWTSessions.instance_variable_set(:"@jwt_options", JWTSessions::JWTOptions.new(*JWT::DefaultOptions::DEFAULT_OPTIONS.values))
|
29
29
|
end
|
30
30
|
|
31
31
|
def test_rsa_token_decode
|
32
|
-
JWTSessions.algorithm =
|
32
|
+
JWTSessions.algorithm = "RS256"
|
33
33
|
JWTSessions.private_key = OpenSSL::PKey::RSA.generate 2048
|
34
34
|
JWTSessions.public_key = JWTSessions.private_key.public_key
|
35
35
|
|
36
36
|
token = JWTSessions::Token.encode(payload)
|
37
37
|
decoded = JWTSessions::Token.decode(token).first
|
38
|
-
assert_equal payload[
|
39
|
-
assert_equal payload[
|
38
|
+
assert_equal payload["user_id"], decoded["user_id"]
|
39
|
+
assert_equal payload["secret"], decoded["secret"]
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_eddsa_token_decode
|
43
43
|
skip unless $uses_nacl
|
44
|
-
JWTSessions.algorithm =
|
45
|
-
JWTSessions.private_key = ::RbNaCl::Signatures::Ed25519::SigningKey.new(
|
44
|
+
JWTSessions.algorithm = "ED25519"
|
45
|
+
JWTSessions.private_key = ::RbNaCl::Signatures::Ed25519::SigningKey.new("abcdefghijklmnopqrstuvwxyzABCDEF")
|
46
46
|
JWTSessions.public_key = JWTSessions.private_key.verify_key
|
47
47
|
|
48
48
|
token = JWTSessions::Token.encode(payload)
|
49
49
|
decoded = JWTSessions::Token.decode(token).first
|
50
|
-
assert_equal payload[
|
51
|
-
assert_equal payload[
|
50
|
+
assert_equal payload["user_id"], decoded["user_id"]
|
51
|
+
assert_equal payload["secret"], decoded["secret"]
|
52
52
|
end
|
53
53
|
|
54
54
|
def test_ecdsa_token_decode
|
55
|
-
JWTSessions.algorithm =
|
56
|
-
JWTSessions.private_key = OpenSSL::PKey::EC.new
|
55
|
+
JWTSessions.algorithm = "ES256"
|
56
|
+
JWTSessions.private_key = OpenSSL::PKey::EC.new "prime256v1"
|
57
57
|
JWTSessions.private_key.generate_key
|
58
58
|
JWTSessions.public_key = OpenSSL::PKey::EC.new JWTSessions.private_key
|
59
59
|
JWTSessions.public_key.private_key = nil
|
60
60
|
|
61
61
|
token = JWTSessions::Token.encode(payload)
|
62
62
|
decoded = JWTSessions::Token.decode(token).first
|
63
|
-
assert_equal payload[
|
64
|
-
assert_equal payload[
|
63
|
+
assert_equal payload["user_id"], decoded["user_id"]
|
64
|
+
assert_equal payload["secret"], decoded["secret"]
|
65
65
|
end
|
66
66
|
|
67
67
|
def test_hmac_token_decode
|
68
|
-
JWTSessions.encryption_key =
|
68
|
+
JWTSessions.encryption_key = "abcdefghijklmnopqrstuvwxyzABCDEF"
|
69
69
|
token = JWTSessions::Token.encode(payload)
|
70
70
|
decoded = JWTSessions::Token.decode(token).first
|
71
|
-
assert_equal payload[
|
72
|
-
assert_equal payload[
|
71
|
+
assert_equal payload["user_id"], decoded["user_id"]
|
72
|
+
assert_equal payload["secret"], decoded["secret"]
|
73
73
|
end
|
74
74
|
|
75
75
|
def test_token_sub_claim
|
76
|
-
JWTSessions.encryption_key =
|
76
|
+
JWTSessions.encryption_key = "abcdefghijklmnopqrstuvwxyzABCDEF"
|
77
77
|
JWTSessions.jwt_options.verify_sub = true
|
78
|
-
token = JWTSessions::Token.encode(payload.merge(sub:
|
79
|
-
decoded = JWTSessions::Token.decode(token, { sub:
|
80
|
-
assert_equal payload[
|
81
|
-
assert_equal payload[
|
78
|
+
token = JWTSessions::Token.encode(payload.merge(sub: "subject"))
|
79
|
+
decoded = JWTSessions::Token.decode(token, { sub: "subject" }).first
|
80
|
+
assert_equal payload["user_id"], decoded["user_id"]
|
81
|
+
assert_equal payload["secret"], decoded["secret"]
|
82
82
|
assert_raises JWTSessions::Errors::ClaimsVerification do
|
83
|
-
JWTSessions::Token.decode(token, { sub:
|
83
|
+
JWTSessions::Token.decode(token, { sub: "different subject" })
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
87
|
def test_token_iss_claim
|
88
|
-
JWTSessions.encryption_key =
|
88
|
+
JWTSessions.encryption_key = "abcdefghijklmnopqrstuvwxyzABCDEF"
|
89
89
|
JWTSessions.jwt_options.verify_iss = true
|
90
|
-
token = JWTSessions::Token.encode(payload.merge(iss:
|
91
|
-
decoded = JWTSessions::Token.decode(token, { iss:
|
92
|
-
assert_equal payload[
|
93
|
-
assert_equal payload[
|
90
|
+
token = JWTSessions::Token.encode(payload.merge(iss: "Me"))
|
91
|
+
decoded = JWTSessions::Token.decode(token, { iss: "Me" }).first
|
92
|
+
assert_equal payload["user_id"], decoded["user_id"]
|
93
|
+
assert_equal payload["secret"], decoded["secret"]
|
94
94
|
assert_raises JWTSessions::Errors::ClaimsVerification do
|
95
|
-
JWTSessions::Token.decode(token, { iss:
|
95
|
+
JWTSessions::Token.decode(token, { iss: "Not Me" })
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
99
|
def test_token_aud_claim
|
100
|
-
JWTSessions.encryption_key =
|
100
|
+
JWTSessions.encryption_key = "abcdefghijklmnopqrstuvwxyzABCDEF"
|
101
101
|
JWTSessions.jwt_options.verify_aud = true
|
102
|
-
token = JWTSessions::Token.encode(payload.merge(aud: [
|
103
|
-
decoded = JWTSessions::Token.decode(token, { aud: [
|
104
|
-
assert_equal payload[
|
105
|
-
assert_equal payload[
|
102
|
+
token = JWTSessions::Token.encode(payload.merge(aud: ["young", "old"]))
|
103
|
+
decoded = JWTSessions::Token.decode(token, { aud: ["young"] }).first
|
104
|
+
assert_equal payload["user_id"], decoded["user_id"]
|
105
|
+
assert_equal payload["secret"], decoded["secret"]
|
106
106
|
assert_raises JWTSessions::Errors::ClaimsVerification do
|
107
|
-
JWTSessions::Token.decode(token, { aud: [
|
107
|
+
JWTSessions::Token.decode(token, { aud: ["adult"] })
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
111
111
|
def test_token_leeway_decode
|
112
|
-
JWTSessions.encryption_key =
|
112
|
+
JWTSessions.encryption_key = "abcdefghijklmnopqrstuvwxyzABCDEF"
|
113
113
|
JWTSessions.jwt_options.leeway = 50
|
114
114
|
token = JWTSessions::Token.encode(payload.merge(exp: Time.now.to_i - 20))
|
115
115
|
decoded = JWTSessions::Token.decode(token).first
|
116
|
-
assert_equal payload[
|
117
|
-
assert_equal payload[
|
116
|
+
assert_equal payload["user_id"], decoded["user_id"]
|
117
|
+
assert_equal payload["secret"], decoded["secret"]
|
118
118
|
token = JWTSessions::Token.encode(payload.merge(exp: Time.now.to_i - 100))
|
119
119
|
assert_raises JWTSessions::Errors::Unauthorized do
|
120
120
|
JWTSessions::Token.decode(token)
|
@@ -125,16 +125,16 @@ class TestToken < Minitest::Test
|
|
125
125
|
JWTSessions.algorithm = JWTSessions::NONE
|
126
126
|
token = JWTSessions::Token.encode(payload)
|
127
127
|
decoded = JWTSessions::Token.decode(token).first
|
128
|
-
assert_equal payload[
|
129
|
-
assert_equal payload[
|
128
|
+
assert_equal payload["user_id"], decoded["user_id"]
|
129
|
+
assert_equal payload["secret"], decoded["secret"]
|
130
130
|
end
|
131
131
|
|
132
132
|
def test_invalid_token_decode
|
133
133
|
assert_raises JWTSessions::Errors::Unauthorized do
|
134
|
-
JWTSessions::Token.decode(
|
134
|
+
JWTSessions::Token.decode("abc")
|
135
135
|
end
|
136
136
|
assert_raises JWTSessions::Errors::Unauthorized do
|
137
|
-
JWTSessions::Token.decode(
|
137
|
+
JWTSessions::Token.decode("")
|
138
138
|
end
|
139
139
|
assert_raises JWTSessions::Errors::Unauthorized do
|
140
140
|
JWTSessions::Token.decode(nil)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "jwt_sessions"
|
5
5
|
|
6
6
|
class TestJWTSessions < Minitest::Test
|
7
7
|
def test_default_settings
|
@@ -30,9 +30,9 @@ class TestJWTSessions < Minitest::Test
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def test_by_token_type
|
33
|
-
assert_equal JWTSessions.access_header, JWTSessions.header_by(
|
34
|
-
assert_equal JWTSessions.refresh_header, JWTSessions.header_by(
|
35
|
-
assert_equal JWTSessions.access_cookie, JWTSessions.cookie_by(
|
36
|
-
assert_equal JWTSessions.refresh_cookie, JWTSessions.cookie_by(
|
33
|
+
assert_equal JWTSessions.access_header, JWTSessions.header_by("access")
|
34
|
+
assert_equal JWTSessions.refresh_header, JWTSessions.header_by("refresh")
|
35
|
+
assert_equal JWTSessions.access_cookie, JWTSessions.cookie_by("access")
|
36
|
+
assert_equal JWTSessions.refresh_cookie, JWTSessions.cookie_by("refresh")
|
37
37
|
end
|
38
38
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "jwt_sessions"
|
5
5
|
|
6
6
|
class TestTokenStore < Minitest::Test
|
7
7
|
def teardown
|
@@ -15,22 +15,22 @@ class TestTokenStore < Minitest::Test
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def test_setting_redis_token_store_with_default_prefix
|
18
|
-
JWTSessions.token_store = :redis, { redis_url:
|
18
|
+
JWTSessions.token_store = :redis, { redis_url: "redis://127.0.0.1:6379/0" }
|
19
19
|
assert_instance_of JWTSessions::StoreAdapters::RedisStoreAdapter, JWTSessions.token_store
|
20
|
-
assert_equal
|
20
|
+
assert_equal "jwt_", JWTSessions.token_store.prefix
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_setting_redis_token_store
|
24
|
-
JWTSessions.token_store = :redis, { redis_url:
|
24
|
+
JWTSessions.token_store = :redis, { redis_url: "redis://127.0.0.1:6379/0", token_prefix: "prefix" }
|
25
25
|
assert_instance_of JWTSessions::StoreAdapters::RedisStoreAdapter, JWTSessions.token_store
|
26
|
-
assert_equal
|
26
|
+
assert_equal "prefix", JWTSessions.token_store.prefix
|
27
27
|
end
|
28
28
|
|
29
29
|
def test_setting_redis_token_store_along_with_module_configuration
|
30
30
|
JWTSessions.redis_port = 6378
|
31
31
|
JWTSessions.token_store = :redis
|
32
32
|
|
33
|
-
assert_equal
|
33
|
+
assert_equal "redis://127.0.0.1:6378/0", JWTSessions.token_store.storage.connection[:id]
|
34
34
|
end
|
35
35
|
|
36
36
|
def test_setting_redis_token_store_without_options
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jwt_sessions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.
|
4
|
+
version: 2.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yulia Oletskaya
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jwt
|
@@ -34,14 +34,14 @@ dependencies:
|
|
34
34
|
name: bundler
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- - "
|
37
|
+
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
39
|
version: '1.16'
|
40
40
|
type: :development
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- - "
|
44
|
+
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '1.16'
|
47
47
|
- !ruby/object:Gem::Dependency
|