firebase_id_token 2.5.2 → 4.0.0
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/.github/workflows/test.yml +28 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +71 -1
- data/Gemfile +7 -0
- data/README.md +97 -56
- data/firebase_id_token.gemspec +14 -12
- data/lib/firebase_id_token/certificates/active_support.rb +92 -0
- data/lib/firebase_id_token/certificates/redis.rb +46 -0
- data/lib/firebase_id_token/certificates.rb +69 -60
- data/lib/firebase_id_token/configuration.rb +10 -3
- data/lib/firebase_id_token/exceptions/unsupported_cache_operation_error.rb +11 -0
- data/lib/firebase_id_token/signature.rb +30 -13
- data/lib/firebase_id_token/testing/certificates.rb +1 -1
- data/lib/firebase_id_token/version.rb +1 -1
- data/lib/firebase_id_token.rb +8 -6
- data/spec/firebase_id_token/certificates/active_support_spec.rb +43 -0
- data/spec/firebase_id_token/certificates/redis_spec.rb +39 -0
- data/spec/firebase_id_token/certificates_session_cookie_spec.rb +49 -0
- data/spec/firebase_id_token/configuration_spec.rb +0 -6
- data/spec/firebase_id_token/signature_session_cookie_spec.rb +65 -0
- data/spec/firebase_id_token/signature_spec.rb +15 -1
- data/spec/firebase_id_token/signature_test_spec.rb +4 -0
- data/spec/firebase_id_token_spec.rb +1 -1
- data/spec/spec_helper.rb +4 -0
- data/spec/support/certificates_shared_examples.rb +196 -0
- metadata +81 -60
- data/CODE_OF_CONDUCT.md +0 -74
- data/spec/firebase_id_token/certificates_spec.rb +0 -164
|
@@ -8,7 +8,8 @@ module FirebaseIdToken
|
|
|
8
8
|
let(:mock_certificates) do
|
|
9
9
|
allow(Certificates)
|
|
10
10
|
.to(receive(:find))
|
|
11
|
-
.with(an_instance_of(String), raise_error: raise_certificates_error
|
|
11
|
+
.with(an_instance_of(String), raise_error: raise_certificates_error,
|
|
12
|
+
source: :id_token)
|
|
12
13
|
.and_return(OpenSSL::X509::Certificate.new(jwt['certificate']))
|
|
13
14
|
end
|
|
14
15
|
|
|
@@ -31,6 +32,19 @@ module FirebaseIdToken
|
|
|
31
32
|
it 'returns nil with a invalid key format' do
|
|
32
33
|
expect(described_class.verify('aaa')).to be(nil)
|
|
33
34
|
end
|
|
35
|
+
|
|
36
|
+
it 'returns nil when the token has no sub claim' do
|
|
37
|
+
payload = {
|
|
38
|
+
'iss' => 'https://securetoken.google.com/firebase-id-token',
|
|
39
|
+
'aud' => 'firebase-id-token',
|
|
40
|
+
'exp' => Time.now.to_i + 3600,
|
|
41
|
+
'iat' => Time.now.to_i - 60
|
|
42
|
+
}
|
|
43
|
+
token = JWT.encode(payload,
|
|
44
|
+
OpenSSL::PKey::RSA.new(jwt['private_key']), 'RS256', kid: 'test')
|
|
45
|
+
|
|
46
|
+
expect(described_class.verify(token)).to be(nil)
|
|
47
|
+
end
|
|
34
48
|
end
|
|
35
49
|
|
|
36
50
|
describe '#verify!' do
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
require 'simplecov'
|
|
2
|
+
require 'simplecov_json_formatter'
|
|
3
|
+
|
|
4
|
+
SimpleCov.formatter = SimpleCov::Formatter::JSONFormatter
|
|
2
5
|
SimpleCov.start
|
|
3
6
|
|
|
4
7
|
require 'bundler/setup'
|
|
@@ -8,6 +11,7 @@ require 'httparty'
|
|
|
8
11
|
require 'jwt'
|
|
9
12
|
require 'firebase_id_token'
|
|
10
13
|
require 'pry'
|
|
14
|
+
require './spec/support/certificates_shared_examples'
|
|
11
15
|
|
|
12
16
|
RSpec.configure do |config|
|
|
13
17
|
# Enable flags like --only-failures and --next-failure
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
# The ActiveSupport store lazily downloads certificates whenever it is
|
|
4
|
+
# instantiated over an empty cache, while the legacy Redis store only
|
|
5
|
+
# downloads them upon an explicit request. Examples whose outcome depends on
|
|
6
|
+
# the empty-cache behavior branch on the `lazy` option.
|
|
7
|
+
shared_examples_for 'a certificate store' do |opts = {}|
|
|
8
|
+
lazy = opts.fetch(:lazy, false)
|
|
9
|
+
|
|
10
|
+
before :each do
|
|
11
|
+
mock_request
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe '#request' do
|
|
15
|
+
it 'requests certificates when the cache is empty' do
|
|
16
|
+
expect(HTTParty).to receive(:get).
|
|
17
|
+
with(FirebaseIdToken::Certificates::URL)
|
|
18
|
+
described_class.request
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'does not requests certificates when the cache is written' do
|
|
22
|
+
expect(HTTParty).to receive(:get).
|
|
23
|
+
with(FirebaseIdToken::Certificates::URL).once
|
|
24
|
+
2.times { described_class.request }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe '#request!' do
|
|
29
|
+
if lazy
|
|
30
|
+
it 'always requests certificates' do
|
|
31
|
+
# The store lazily loads the empty cache once before the first
|
|
32
|
+
# explicit request, hence the extra call.
|
|
33
|
+
expect(HTTParty).to receive(:get).
|
|
34
|
+
with(FirebaseIdToken::Certificates::URL).exactly(3).times
|
|
35
|
+
2.times { described_class.request! }
|
|
36
|
+
end
|
|
37
|
+
else
|
|
38
|
+
it 'always requests certificates' do
|
|
39
|
+
expect(HTTParty).to receive(:get).
|
|
40
|
+
with(FirebaseIdToken::Certificates::URL).twice
|
|
41
|
+
2.times { described_class.request! }
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it 'sets the certificate expiration time as the cache TTL' do
|
|
46
|
+
described_class.request!
|
|
47
|
+
expect(described_class.ttl).to be > 3600
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'raises a error when certificates expires in less than 1 hour' do
|
|
51
|
+
allow(response).to receive(:headers) {{'cache-control' => low_cache}}
|
|
52
|
+
expect{ described_class.request! }.
|
|
53
|
+
to raise_error(FirebaseIdToken::Exceptions::CertificatesTtlError)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'raises a error when HTTP response code is other than 200' do
|
|
57
|
+
allow(response).to receive(:code) { 401 }
|
|
58
|
+
expect{ described_class.request! }.
|
|
59
|
+
to raise_error(FirebaseIdToken::Exceptions::CertificatesRequestError)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
describe '#request_anyway' do
|
|
64
|
+
if lazy
|
|
65
|
+
it 'also requests certificates' do
|
|
66
|
+
expect(HTTParty).to receive(:get).
|
|
67
|
+
with(FirebaseIdToken::Certificates::URL).twice
|
|
68
|
+
described_class.request_anyway
|
|
69
|
+
end
|
|
70
|
+
else
|
|
71
|
+
it 'also requests certificates' do
|
|
72
|
+
expect(HTTParty).to receive(:get).
|
|
73
|
+
with(FirebaseIdToken::Certificates::URL)
|
|
74
|
+
described_class.request_anyway
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
describe '.present?' do
|
|
80
|
+
if lazy
|
|
81
|
+
it 'returns true when the cache is empty, lazily fetching' do
|
|
82
|
+
expect(described_class.present?).to be(true)
|
|
83
|
+
end
|
|
84
|
+
else
|
|
85
|
+
it 'returns false when the cache is empty' do
|
|
86
|
+
expect(described_class.present?).to be(false)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it 'returns true when the cache is written' do
|
|
91
|
+
described_class.request
|
|
92
|
+
expect(described_class.present?).to be(true)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
describe '.all' do
|
|
97
|
+
context 'before requesting certificates' do
|
|
98
|
+
if lazy
|
|
99
|
+
it 'lazily fetches and returns the certificates' do
|
|
100
|
+
expect(described_class.all.first.values[0]).
|
|
101
|
+
to be_a(OpenSSL::X509::Certificate)
|
|
102
|
+
end
|
|
103
|
+
else
|
|
104
|
+
it 'returns a empty Array' do
|
|
105
|
+
expect(described_class.all).to eq([])
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
context 'after requesting certificates' do
|
|
111
|
+
it 'returns a array of hashes: String keys' do
|
|
112
|
+
described_class.request
|
|
113
|
+
expect(described_class.all.first.keys[0]).to be_a(String)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it 'returns a array of hashes: OpenSSL::X509::Certificate values' do
|
|
117
|
+
described_class.request
|
|
118
|
+
expect(described_class.all.first.values[0]).
|
|
119
|
+
to be_a(OpenSSL::X509::Certificate)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
describe '.find' do
|
|
125
|
+
context 'without certificates in the cache' do
|
|
126
|
+
if lazy
|
|
127
|
+
it 'lazily fetches certificates and finds the kid' do
|
|
128
|
+
expect(described_class.find(kid)).to be_a(OpenSSL::X509::Certificate)
|
|
129
|
+
end
|
|
130
|
+
else
|
|
131
|
+
it 'raises a exception' do
|
|
132
|
+
expect{ described_class.find(kid)}.
|
|
133
|
+
to raise_error(FirebaseIdToken::Exceptions::NoCertificatesError)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
context 'with certificates in the cache' do
|
|
139
|
+
it 'returns a OpenSSL::X509::Certificate when it finds the kid' do
|
|
140
|
+
described_class.request
|
|
141
|
+
expect(described_class.find(kid)).to be_a(OpenSSL::X509::Certificate)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it 'returns nil when it can not find the kid' do
|
|
145
|
+
described_class.request
|
|
146
|
+
expect(described_class.find('')).to be(nil)
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
describe '.find!' do
|
|
152
|
+
context 'without certificates in the cache' do
|
|
153
|
+
if lazy
|
|
154
|
+
it 'lazily fetches certificates and finds the kid' do
|
|
155
|
+
expect(described_class.find!(kid)).to be_a(OpenSSL::X509::Certificate)
|
|
156
|
+
end
|
|
157
|
+
else
|
|
158
|
+
it 'raises a exception' do
|
|
159
|
+
expect{ described_class.find!(kid)}.
|
|
160
|
+
to raise_error(FirebaseIdToken::Exceptions::NoCertificatesError)
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
context 'with certificates in the cache' do
|
|
166
|
+
it 'returns a OpenSSL::X509::Certificate when it finds the kid' do
|
|
167
|
+
described_class.request
|
|
168
|
+
expect(described_class.find!(kid)).to be_a(OpenSSL::X509::Certificate)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it 'raises a CertificateNotFound error when it can not find the kid' do
|
|
172
|
+
described_class.request
|
|
173
|
+
expect { described_class.find!('') }
|
|
174
|
+
.to raise_error(FirebaseIdToken::Exceptions::CertificateNotFound, /Unable to find/)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
describe '.ttl' do
|
|
181
|
+
it 'returns a positive number when has certificates in the cache' do
|
|
182
|
+
described_class.request
|
|
183
|
+
expect(described_class.ttl).to be > 0
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
if lazy
|
|
187
|
+
it 'returns a positive number when the cache is empty, lazily fetching' do
|
|
188
|
+
expect(described_class.ttl).to be > 0
|
|
189
|
+
end
|
|
190
|
+
else
|
|
191
|
+
it 'returns zero when has no certificates in the cache' do
|
|
192
|
+
expect(described_class.ttl).to eq(0)
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: firebase_id_token
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 4.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Fernando Schuindt
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: bundler
|
|
@@ -16,203 +15,219 @@ dependencies:
|
|
|
16
15
|
requirements:
|
|
17
16
|
- - "~>"
|
|
18
17
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '2.
|
|
18
|
+
version: '2.4'
|
|
20
19
|
- - ">="
|
|
21
20
|
- !ruby/object:Gem::Version
|
|
22
|
-
version: 2.
|
|
21
|
+
version: 2.4.13
|
|
23
22
|
type: :development
|
|
24
23
|
prerelease: false
|
|
25
24
|
version_requirements: !ruby/object:Gem::Requirement
|
|
26
25
|
requirements:
|
|
27
26
|
- - "~>"
|
|
28
27
|
- !ruby/object:Gem::Version
|
|
29
|
-
version: '2.
|
|
28
|
+
version: '2.4'
|
|
30
29
|
- - ">="
|
|
31
30
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: 2.
|
|
31
|
+
version: 2.4.13
|
|
33
32
|
- !ruby/object:Gem::Dependency
|
|
34
33
|
name: rake
|
|
35
34
|
requirement: !ruby/object:Gem::Requirement
|
|
36
35
|
requirements:
|
|
37
36
|
- - "~>"
|
|
38
37
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '
|
|
38
|
+
version: '13.0'
|
|
40
39
|
- - ">="
|
|
41
40
|
- !ruby/object:Gem::Version
|
|
42
|
-
version:
|
|
41
|
+
version: 13.0.6
|
|
43
42
|
type: :development
|
|
44
43
|
prerelease: false
|
|
45
44
|
version_requirements: !ruby/object:Gem::Requirement
|
|
46
45
|
requirements:
|
|
47
46
|
- - "~>"
|
|
48
47
|
- !ruby/object:Gem::Version
|
|
49
|
-
version: '
|
|
48
|
+
version: '13.0'
|
|
50
49
|
- - ">="
|
|
51
50
|
- !ruby/object:Gem::Version
|
|
52
|
-
version:
|
|
51
|
+
version: 13.0.6
|
|
53
52
|
- !ruby/object:Gem::Dependency
|
|
54
53
|
name: rspec
|
|
55
54
|
requirement: !ruby/object:Gem::Requirement
|
|
56
55
|
requirements:
|
|
57
56
|
- - "~>"
|
|
58
57
|
- !ruby/object:Gem::Version
|
|
59
|
-
version: '3.
|
|
58
|
+
version: '3.12'
|
|
60
59
|
type: :development
|
|
61
60
|
prerelease: false
|
|
62
61
|
version_requirements: !ruby/object:Gem::Requirement
|
|
63
62
|
requirements:
|
|
64
63
|
- - "~>"
|
|
65
64
|
- !ruby/object:Gem::Version
|
|
66
|
-
version: '3.
|
|
65
|
+
version: '3.12'
|
|
67
66
|
- !ruby/object:Gem::Dependency
|
|
68
67
|
name: redcarpet
|
|
69
68
|
requirement: !ruby/object:Gem::Requirement
|
|
70
69
|
requirements:
|
|
71
70
|
- - "~>"
|
|
72
71
|
- !ruby/object:Gem::Version
|
|
73
|
-
version: '3.
|
|
74
|
-
- - ">="
|
|
75
|
-
- !ruby/object:Gem::Version
|
|
76
|
-
version: 3.4.0
|
|
72
|
+
version: '3.6'
|
|
77
73
|
type: :development
|
|
78
74
|
prerelease: false
|
|
79
75
|
version_requirements: !ruby/object:Gem::Requirement
|
|
80
76
|
requirements:
|
|
81
77
|
- - "~>"
|
|
82
78
|
- !ruby/object:Gem::Version
|
|
83
|
-
version: '3.
|
|
84
|
-
- - ">="
|
|
85
|
-
- !ruby/object:Gem::Version
|
|
86
|
-
version: 3.4.0
|
|
79
|
+
version: '3.6'
|
|
87
80
|
- !ruby/object:Gem::Dependency
|
|
88
81
|
name: simplecov
|
|
89
82
|
requirement: !ruby/object:Gem::Requirement
|
|
90
83
|
requirements:
|
|
91
84
|
- - "~>"
|
|
92
85
|
- !ruby/object:Gem::Version
|
|
93
|
-
version: 0.
|
|
86
|
+
version: 0.22.0
|
|
94
87
|
type: :development
|
|
95
88
|
prerelease: false
|
|
96
89
|
version_requirements: !ruby/object:Gem::Requirement
|
|
97
90
|
requirements:
|
|
98
91
|
- - "~>"
|
|
99
92
|
- !ruby/object:Gem::Version
|
|
100
|
-
version: 0.
|
|
93
|
+
version: 0.22.0
|
|
101
94
|
- !ruby/object:Gem::Dependency
|
|
102
|
-
name:
|
|
95
|
+
name: simplecov_json_formatter
|
|
103
96
|
requirement: !ruby/object:Gem::Requirement
|
|
104
97
|
requirements:
|
|
105
98
|
- - "~>"
|
|
106
99
|
- !ruby/object:Gem::Version
|
|
107
|
-
version:
|
|
108
|
-
- - ">="
|
|
109
|
-
- !ruby/object:Gem::Version
|
|
110
|
-
version: 1.0.0
|
|
100
|
+
version: 0.1.2
|
|
111
101
|
type: :development
|
|
112
102
|
prerelease: false
|
|
113
103
|
version_requirements: !ruby/object:Gem::Requirement
|
|
114
104
|
requirements:
|
|
115
105
|
- - "~>"
|
|
116
106
|
- !ruby/object:Gem::Version
|
|
117
|
-
version:
|
|
118
|
-
- - ">="
|
|
119
|
-
- !ruby/object:Gem::Version
|
|
120
|
-
version: 1.0.0
|
|
107
|
+
version: 0.1.2
|
|
121
108
|
- !ruby/object:Gem::Dependency
|
|
122
109
|
name: pry
|
|
123
110
|
requirement: !ruby/object:Gem::Requirement
|
|
124
111
|
requirements:
|
|
125
112
|
- - "~>"
|
|
126
113
|
- !ruby/object:Gem::Version
|
|
127
|
-
version: 0.
|
|
114
|
+
version: 0.14.2
|
|
128
115
|
type: :development
|
|
129
116
|
prerelease: false
|
|
130
117
|
version_requirements: !ruby/object:Gem::Requirement
|
|
131
118
|
requirements:
|
|
132
119
|
- - "~>"
|
|
133
120
|
- !ruby/object:Gem::Version
|
|
134
|
-
version: 0.
|
|
121
|
+
version: 0.14.2
|
|
135
122
|
- !ruby/object:Gem::Dependency
|
|
136
123
|
name: redis
|
|
137
124
|
requirement: !ruby/object:Gem::Requirement
|
|
138
125
|
requirements:
|
|
139
126
|
- - "~>"
|
|
140
127
|
- !ruby/object:Gem::Version
|
|
141
|
-
version: '
|
|
128
|
+
version: '5.0'
|
|
142
129
|
- - ">="
|
|
143
130
|
- !ruby/object:Gem::Version
|
|
144
|
-
version:
|
|
145
|
-
type: :
|
|
131
|
+
version: 5.0.6
|
|
132
|
+
type: :development
|
|
146
133
|
prerelease: false
|
|
147
134
|
version_requirements: !ruby/object:Gem::Requirement
|
|
148
135
|
requirements:
|
|
149
136
|
- - "~>"
|
|
150
137
|
- !ruby/object:Gem::Version
|
|
151
|
-
version: '
|
|
138
|
+
version: '5.0'
|
|
152
139
|
- - ">="
|
|
153
140
|
- !ruby/object:Gem::Version
|
|
154
|
-
version:
|
|
141
|
+
version: 5.0.6
|
|
155
142
|
- !ruby/object:Gem::Dependency
|
|
156
143
|
name: redis-namespace
|
|
157
144
|
requirement: !ruby/object:Gem::Requirement
|
|
158
145
|
requirements:
|
|
159
146
|
- - "~>"
|
|
160
147
|
- !ruby/object:Gem::Version
|
|
161
|
-
version: '1.
|
|
148
|
+
version: '1.10'
|
|
149
|
+
type: :development
|
|
150
|
+
prerelease: false
|
|
151
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
152
|
+
requirements:
|
|
153
|
+
- - "~>"
|
|
154
|
+
- !ruby/object:Gem::Version
|
|
155
|
+
version: '1.10'
|
|
156
|
+
- !ruby/object:Gem::Dependency
|
|
157
|
+
name: httparty
|
|
158
|
+
requirement: !ruby/object:Gem::Requirement
|
|
159
|
+
requirements:
|
|
162
160
|
- - ">="
|
|
163
161
|
- !ruby/object:Gem::Version
|
|
164
|
-
version:
|
|
162
|
+
version: '0.21'
|
|
163
|
+
- - "<"
|
|
164
|
+
- !ruby/object:Gem::Version
|
|
165
|
+
version: '1.0'
|
|
165
166
|
type: :runtime
|
|
166
167
|
prerelease: false
|
|
167
168
|
version_requirements: !ruby/object:Gem::Requirement
|
|
169
|
+
requirements:
|
|
170
|
+
- - ">="
|
|
171
|
+
- !ruby/object:Gem::Version
|
|
172
|
+
version: '0.21'
|
|
173
|
+
- - "<"
|
|
174
|
+
- !ruby/object:Gem::Version
|
|
175
|
+
version: '1.0'
|
|
176
|
+
- !ruby/object:Gem::Dependency
|
|
177
|
+
name: jwt
|
|
178
|
+
requirement: !ruby/object:Gem::Requirement
|
|
168
179
|
requirements:
|
|
169
180
|
- - "~>"
|
|
170
181
|
- !ruby/object:Gem::Version
|
|
171
|
-
version: '
|
|
172
|
-
|
|
182
|
+
version: '2.7'
|
|
183
|
+
type: :runtime
|
|
184
|
+
prerelease: false
|
|
185
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
186
|
+
requirements:
|
|
187
|
+
- - "~>"
|
|
173
188
|
- !ruby/object:Gem::Version
|
|
174
|
-
version:
|
|
189
|
+
version: '2.7'
|
|
175
190
|
- !ruby/object:Gem::Dependency
|
|
176
|
-
name:
|
|
191
|
+
name: activesupport
|
|
177
192
|
requirement: !ruby/object:Gem::Requirement
|
|
178
193
|
requirements:
|
|
179
194
|
- - "~>"
|
|
180
195
|
- !ruby/object:Gem::Version
|
|
181
|
-
version: '0
|
|
196
|
+
version: '7.0'
|
|
182
197
|
- - ">="
|
|
183
198
|
- !ruby/object:Gem::Version
|
|
184
|
-
version: 0.
|
|
199
|
+
version: 7.0.4.3
|
|
185
200
|
type: :runtime
|
|
186
201
|
prerelease: false
|
|
187
202
|
version_requirements: !ruby/object:Gem::Requirement
|
|
188
203
|
requirements:
|
|
189
204
|
- - "~>"
|
|
190
205
|
- !ruby/object:Gem::Version
|
|
191
|
-
version: '0
|
|
206
|
+
version: '7.0'
|
|
192
207
|
- - ">="
|
|
193
208
|
- !ruby/object:Gem::Version
|
|
194
|
-
version: 0.
|
|
209
|
+
version: 7.0.4.3
|
|
195
210
|
- !ruby/object:Gem::Dependency
|
|
196
|
-
name:
|
|
211
|
+
name: json
|
|
197
212
|
requirement: !ruby/object:Gem::Requirement
|
|
198
213
|
requirements:
|
|
199
214
|
- - "~>"
|
|
200
215
|
- !ruby/object:Gem::Version
|
|
201
|
-
version: '2.
|
|
216
|
+
version: '2.6'
|
|
202
217
|
- - ">="
|
|
203
218
|
- !ruby/object:Gem::Version
|
|
204
|
-
version: 2.
|
|
219
|
+
version: 2.6.3
|
|
205
220
|
type: :runtime
|
|
206
221
|
prerelease: false
|
|
207
222
|
version_requirements: !ruby/object:Gem::Requirement
|
|
208
223
|
requirements:
|
|
209
224
|
- - "~>"
|
|
210
225
|
- !ruby/object:Gem::Version
|
|
211
|
-
version: '2.
|
|
226
|
+
version: '2.6'
|
|
212
227
|
- - ">="
|
|
213
228
|
- !ruby/object:Gem::Version
|
|
214
|
-
version: 2.
|
|
215
|
-
description: A Ruby gem to verify the signature of Firebase ID Tokens. It uses
|
|
229
|
+
version: 2.6.3
|
|
230
|
+
description: A Ruby gem to verify the signature of Firebase ID Tokens. It uses ActiveSupport::Cache
|
|
216
231
|
to store Google's x509 certificates and manage their expiration time, so you don't
|
|
217
232
|
need to request Google's API in every execution and can access it as fast as reading
|
|
218
233
|
from memory.
|
|
@@ -222,12 +237,13 @@ executables: []
|
|
|
222
237
|
extensions: []
|
|
223
238
|
extra_rdoc_files: []
|
|
224
239
|
files:
|
|
240
|
+
- ".github/workflows/test.yml"
|
|
225
241
|
- ".gitignore"
|
|
226
242
|
- ".rspec"
|
|
243
|
+
- ".ruby-version"
|
|
227
244
|
- ".travis.yml"
|
|
228
245
|
- ".yardopts"
|
|
229
246
|
- CHANGELOG.md
|
|
230
|
-
- CODE_OF_CONDUCT.md
|
|
231
247
|
- Gemfile
|
|
232
248
|
- LICENSE.txt
|
|
233
249
|
- README.md
|
|
@@ -238,16 +254,22 @@ files:
|
|
|
238
254
|
- firebase_id_token.gemspec
|
|
239
255
|
- lib/firebase_id_token.rb
|
|
240
256
|
- lib/firebase_id_token/certificates.rb
|
|
257
|
+
- lib/firebase_id_token/certificates/active_support.rb
|
|
258
|
+
- lib/firebase_id_token/certificates/redis.rb
|
|
241
259
|
- lib/firebase_id_token/configuration.rb
|
|
242
260
|
- lib/firebase_id_token/exceptions/certificate_not_found.rb
|
|
243
261
|
- lib/firebase_id_token/exceptions/certificates_request_error.rb
|
|
244
262
|
- lib/firebase_id_token/exceptions/certificates_ttl_error.rb
|
|
245
263
|
- lib/firebase_id_token/exceptions/no_certificates_error.rb
|
|
264
|
+
- lib/firebase_id_token/exceptions/unsupported_cache_operation_error.rb
|
|
246
265
|
- lib/firebase_id_token/signature.rb
|
|
247
266
|
- lib/firebase_id_token/testing/certificates.rb
|
|
248
267
|
- lib/firebase_id_token/version.rb
|
|
249
|
-
- spec/firebase_id_token/
|
|
268
|
+
- spec/firebase_id_token/certificates/active_support_spec.rb
|
|
269
|
+
- spec/firebase_id_token/certificates/redis_spec.rb
|
|
270
|
+
- spec/firebase_id_token/certificates_session_cookie_spec.rb
|
|
250
271
|
- spec/firebase_id_token/configuration_spec.rb
|
|
272
|
+
- spec/firebase_id_token/signature_session_cookie_spec.rb
|
|
251
273
|
- spec/firebase_id_token/signature_spec.rb
|
|
252
274
|
- spec/firebase_id_token/signature_test_spec.rb
|
|
253
275
|
- spec/firebase_id_token_spec.rb
|
|
@@ -256,11 +278,11 @@ files:
|
|
|
256
278
|
- spec/fixtures/files/jwt.json
|
|
257
279
|
- spec/fixtures/files/payload.json
|
|
258
280
|
- spec/spec_helper.rb
|
|
281
|
+
- spec/support/certificates_shared_examples.rb
|
|
259
282
|
homepage: https://github.com/fschuindt/firebase_id_token
|
|
260
283
|
licenses:
|
|
261
284
|
- MIT
|
|
262
285
|
metadata: {}
|
|
263
|
-
post_install_message:
|
|
264
286
|
rdoc_options: []
|
|
265
287
|
require_paths:
|
|
266
288
|
- lib
|
|
@@ -275,8 +297,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
275
297
|
- !ruby/object:Gem::Version
|
|
276
298
|
version: '0'
|
|
277
299
|
requirements: []
|
|
278
|
-
rubygems_version:
|
|
279
|
-
signing_key:
|
|
300
|
+
rubygems_version: 4.0.3
|
|
280
301
|
specification_version: 4
|
|
281
302
|
summary: A Firebase ID Token verifier.
|
|
282
303
|
test_files: []
|
data/CODE_OF_CONDUCT.md
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# Contributor Covenant Code of Conduct
|
|
2
|
-
|
|
3
|
-
## Our Pledge
|
|
4
|
-
|
|
5
|
-
In the interest of fostering an open and welcoming environment, we as
|
|
6
|
-
contributors and maintainers pledge to making participation in our project and
|
|
7
|
-
our community a harassment-free experience for everyone, regardless of age, body
|
|
8
|
-
size, disability, ethnicity, gender identity and expression, level of experience,
|
|
9
|
-
nationality, personal appearance, race, religion, or sexual identity and
|
|
10
|
-
orientation.
|
|
11
|
-
|
|
12
|
-
## Our Standards
|
|
13
|
-
|
|
14
|
-
Examples of behavior that contributes to creating a positive environment
|
|
15
|
-
include:
|
|
16
|
-
|
|
17
|
-
* Using welcoming and inclusive language
|
|
18
|
-
* Being respectful of differing viewpoints and experiences
|
|
19
|
-
* Gracefully accepting constructive criticism
|
|
20
|
-
* Focusing on what is best for the community
|
|
21
|
-
* Showing empathy towards other community members
|
|
22
|
-
|
|
23
|
-
Examples of unacceptable behavior by participants include:
|
|
24
|
-
|
|
25
|
-
* The use of sexualized language or imagery and unwelcome sexual attention or
|
|
26
|
-
advances
|
|
27
|
-
* Trolling, insulting/derogatory comments, and personal or political attacks
|
|
28
|
-
* Public or private harassment
|
|
29
|
-
* Publishing others' private information, such as a physical or electronic
|
|
30
|
-
address, without explicit permission
|
|
31
|
-
* Other conduct which could reasonably be considered inappropriate in a
|
|
32
|
-
professional setting
|
|
33
|
-
|
|
34
|
-
## Our Responsibilities
|
|
35
|
-
|
|
36
|
-
Project maintainers are responsible for clarifying the standards of acceptable
|
|
37
|
-
behavior and are expected to take appropriate and fair corrective action in
|
|
38
|
-
response to any instances of unacceptable behavior.
|
|
39
|
-
|
|
40
|
-
Project maintainers have the right and responsibility to remove, edit, or
|
|
41
|
-
reject comments, commits, code, wiki edits, issues, and other contributions
|
|
42
|
-
that are not aligned to this Code of Conduct, or to ban temporarily or
|
|
43
|
-
permanently any contributor for other behaviors that they deem inappropriate,
|
|
44
|
-
threatening, offensive, or harmful.
|
|
45
|
-
|
|
46
|
-
## Scope
|
|
47
|
-
|
|
48
|
-
This Code of Conduct applies both within project spaces and in public spaces
|
|
49
|
-
when an individual is representing the project or its community. Examples of
|
|
50
|
-
representing a project or community include using an official project e-mail
|
|
51
|
-
address, posting via an official social media account, or acting as an appointed
|
|
52
|
-
representative at an online or offline event. Representation of a project may be
|
|
53
|
-
further defined and clarified by project maintainers.
|
|
54
|
-
|
|
55
|
-
## Enforcement
|
|
56
|
-
|
|
57
|
-
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
58
|
-
reported by contacting the project team at f.schuindtcs@gmail.com. All
|
|
59
|
-
complaints will be reviewed and investigated and will result in a response that
|
|
60
|
-
is deemed necessary and appropriate to the circumstances. The project team is
|
|
61
|
-
obligated to maintain confidentiality with regard to the reporter of an incident.
|
|
62
|
-
Further details of specific enforcement policies may be posted separately.
|
|
63
|
-
|
|
64
|
-
Project maintainers who do not follow or enforce the Code of Conduct in good
|
|
65
|
-
faith may face temporary or permanent repercussions as determined by other
|
|
66
|
-
members of the project's leadership.
|
|
67
|
-
|
|
68
|
-
## Attribution
|
|
69
|
-
|
|
70
|
-
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
|
71
|
-
available at [http://contributor-covenant.org/version/1/4][version]
|
|
72
|
-
|
|
73
|
-
[homepage]: http://contributor-covenant.org
|
|
74
|
-
[version]: http://contributor-covenant.org/version/1/4/
|