firebase-admin 0.1.6 → 0.3.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/.gitignore +3 -0
- data/Gemfile.lock +3 -2
- data/lib/firebase-admin/client/accounts.rb +25 -37
- data/lib/firebase-admin/configuration.rb +34 -0
- data/lib/firebase-admin/version.rb +1 -1
- data/spec/firebase-admin/api_spec.rb +3 -1
- data/spec/firebase-admin/client/accounts_spec.rb +34 -12
- data/spec/fixtures/delete_account.json +1 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20dc769e214cf7c48d6b86d37bd17d0b806fada175e90e538fb728645d31e3ea
|
4
|
+
data.tar.gz: 885264043ab60ad951e9b9ddb2785e2d9710523ce1d342b82851899a720f362d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c2f316c8753ab8e3855e45f08fa0355c40cb31a9bf4127de53f4d51761f801b1ed2c8313d7c4b19cfc597e1b4f2680259d4193d60bfd2a836d6d3c06adf7058
|
7
|
+
data.tar.gz: d79b0c5cff44a1de0b96474680f88440ddfe9c5942045437a63e1b6346961371d6cf1866331fbfa078f7b281351c219e962c351906b2309c2556024baf38e5dc
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
firebase-admin (0.
|
4
|
+
firebase-admin (0.3.0)
|
5
5
|
addressable (~> 2.7)
|
6
6
|
faraday (~> 1.3)
|
7
7
|
faraday_middleware (~> 1.0)
|
@@ -85,6 +85,7 @@ GEM
|
|
85
85
|
hashdiff (>= 0.4.0, < 2.0.0)
|
86
86
|
|
87
87
|
PLATFORMS
|
88
|
+
arm64-darwin-21
|
88
89
|
x86_64-darwin-20
|
89
90
|
|
90
91
|
DEPENDENCIES
|
@@ -95,4 +96,4 @@ DEPENDENCIES
|
|
95
96
|
webmock (~> 3.11)
|
96
97
|
|
97
98
|
BUNDLED WITH
|
98
|
-
2.
|
99
|
+
2.3.17
|
@@ -63,6 +63,20 @@ module FirebaseAdmin
|
|
63
63
|
post("v1/projects/#{project_id}/accounts:update", params)
|
64
64
|
end
|
65
65
|
|
66
|
+
# DELETES the account completely from firebase. Once deleted we can retreive the account
|
67
|
+
# Need to be used cautiously
|
68
|
+
#
|
69
|
+
# @return 200 OK
|
70
|
+
# @see https://firebase.google.com/docs/reference/rest/auth
|
71
|
+
#
|
72
|
+
# @param localId [String] profile ID
|
73
|
+
def delete_account(localId)
|
74
|
+
params = {'localId': localId}
|
75
|
+
path = "v1/projects/#{project_id}/accounts:delete"
|
76
|
+
post path, params
|
77
|
+
end
|
78
|
+
|
79
|
+
|
66
80
|
# Sign in with a password
|
67
81
|
#
|
68
82
|
# @param params [Hash] A customizable set of params
|
@@ -117,6 +131,16 @@ module FirebaseAdmin
|
|
117
131
|
# @example
|
118
132
|
# FirebaseAdmin.create_custom_token('...')
|
119
133
|
def create_custom_token(uid)
|
134
|
+
if service_account_email.nil? || service_account_email == ''
|
135
|
+
raise InvalidCredentials,
|
136
|
+
"No client email provided via options, 'GOOGLE_APPLICATION_CREDENTIALS' or 'GOOGLE_CLIENT_EMAIL'"
|
137
|
+
end
|
138
|
+
|
139
|
+
if service_account_private_key.nil? || service_account_private_key == ''
|
140
|
+
raise InvalidCredentials,
|
141
|
+
"No private key provided via options, 'GOOGLE_APPLICATION_CREDENTIALS' or 'GOOGLE_PRIVATE_KEY'"
|
142
|
+
end
|
143
|
+
|
120
144
|
now_seconds = Time.now.to_i
|
121
145
|
payload = {
|
122
146
|
iss: service_account_email,
|
@@ -126,7 +150,7 @@ module FirebaseAdmin
|
|
126
150
|
exp: now_seconds + (60 * 60), # Maximum expiration time is one hour
|
127
151
|
uid: uid
|
128
152
|
}
|
129
|
-
JWT.encode(payload,
|
153
|
+
JWT.encode(payload, OpenSSL::PKey::RSA.new(unescape(service_account_private_key)), 'RS256')
|
130
154
|
end
|
131
155
|
|
132
156
|
# Get user by email/phone/uid
|
@@ -163,42 +187,6 @@ module FirebaseAdmin
|
|
163
187
|
str = str[1..-2] if str.start_with?('"') && str.end_with?('"')
|
164
188
|
str
|
165
189
|
end
|
166
|
-
|
167
|
-
def service_account_email
|
168
|
-
email = default_credentials.fetch('client_email') { ENV['GOOGLE_CLIENT_EMAIL'] }
|
169
|
-
if email.nil? || email == ''
|
170
|
-
raise InvalidCredentials,
|
171
|
-
"No client email provided via 'GOOGLE_APPLICATION_CREDENTIALS' or 'GOOGLE_CLIENT_EMAIL'"
|
172
|
-
end
|
173
|
-
|
174
|
-
email
|
175
|
-
end
|
176
|
-
|
177
|
-
def private_key
|
178
|
-
key = default_credentials.fetch('private_key') { unescape(ENV['GOOGLE_PRIVATE_KEY']) }
|
179
|
-
if key.nil? || key == ''
|
180
|
-
raise InvalidCredentials,
|
181
|
-
"No private key provided via 'GOOGLE_APPLICATION_CREDENTIALS' or 'GOOGLE_PRIVATE_KEY'"
|
182
|
-
end
|
183
|
-
|
184
|
-
OpenSSL::PKey::RSA.new(key)
|
185
|
-
end
|
186
|
-
|
187
|
-
def default_credentials
|
188
|
-
@default_credentials ||= read_default_credentials
|
189
|
-
end
|
190
|
-
|
191
|
-
def read_default_credentials
|
192
|
-
credentials_path = ENV['GOOGLE_APPLICATION_CREDENTIALS']
|
193
|
-
if credentials_path && File.exist?(credentials_path)
|
194
|
-
JSON.parse(File.read(credentials_path))
|
195
|
-
else
|
196
|
-
{}
|
197
|
-
end
|
198
|
-
rescue StandardError => e
|
199
|
-
raise InvalidCredentials,
|
200
|
-
"Failed reading credentials from '#{ENV['GOOGLE_APPLICATION_CREDENTIALS']}'. Error: #{e.message}"
|
201
|
-
end
|
202
190
|
end
|
203
191
|
end
|
204
192
|
end
|
@@ -13,6 +13,8 @@ module FirebaseAdmin
|
|
13
13
|
user_agent
|
14
14
|
project_id
|
15
15
|
loud_logger
|
16
|
+
service_account_email
|
17
|
+
service_account_private_key
|
16
18
|
].freeze
|
17
19
|
|
18
20
|
# By default, don't set a user access token
|
@@ -47,6 +49,18 @@ module FirebaseAdmin
|
|
47
49
|
# @private
|
48
50
|
attr_accessor(*VALID_OPTIONS_KEYS)
|
49
51
|
|
52
|
+
def service_account_email
|
53
|
+
@service_account_email ||= service_account_credentials.fetch('client_email') do
|
54
|
+
ENV['GOOGLE_CLIENT_EMAIL']
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def service_account_private_key
|
59
|
+
@service_account_private_key ||= service_account_credentials.fetch('private_key') do
|
60
|
+
ENV['GOOGLE_PRIVATE_KEY']
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
50
64
|
# When this module is extended, set all configuration options to their default values
|
51
65
|
def self.extended(base)
|
52
66
|
base.reset
|
@@ -64,6 +78,23 @@ module FirebaseAdmin
|
|
64
78
|
end
|
65
79
|
end
|
66
80
|
|
81
|
+
def service_account_credentials
|
82
|
+
return {} unless ENV['GOOGLE_APPLICATION_CREDENTIALS']
|
83
|
+
|
84
|
+
@service_account_credentials ||= read_service_account_credentials(ENV['GOOGLE_APPLICATION_CREDENTIALS'])
|
85
|
+
end
|
86
|
+
|
87
|
+
def read_service_account_credentials(credentials_path)
|
88
|
+
if credentials_path && File.exist?(credentials_path)
|
89
|
+
JSON.parse(File.read(credentials_path))
|
90
|
+
else
|
91
|
+
{}
|
92
|
+
end
|
93
|
+
rescue StandardError => e
|
94
|
+
raise InvalidCredentials,
|
95
|
+
"Failed reading credentials from '#{ENV['GOOGLE_APPLICATION_CREDENTIALS']}'. Error: #{e.message}"
|
96
|
+
end
|
97
|
+
|
67
98
|
# Reset all configuration options to defaults
|
68
99
|
def reset
|
69
100
|
self.access_token = DEFAULT_ACCESS_TOKEN
|
@@ -73,6 +104,9 @@ module FirebaseAdmin
|
|
73
104
|
self.user_agent = DEFAULT_USER_AGENT
|
74
105
|
self.project_id = DEFAULT_PROJECT_ID
|
75
106
|
self.loud_logger = DEFAULT_LOUD_LOGGER
|
107
|
+
@service_account_credentials = nil
|
108
|
+
self.service_account_email = nil
|
109
|
+
self.service_account_private_key = nil
|
76
110
|
end
|
77
111
|
end
|
78
112
|
end
|
@@ -34,7 +34,9 @@ describe FirebaseAdmin::API do
|
|
34
34
|
endpoint: 'http://tumblr.com/',
|
35
35
|
user_agent: 'Custom User Agent',
|
36
36
|
project_id: 'test-project',
|
37
|
-
loud_logger: true
|
37
|
+
loud_logger: true,
|
38
|
+
service_account_email: 'example@gmail.com',
|
39
|
+
service_account_private_key: '===private key==='
|
38
40
|
}
|
39
41
|
end
|
40
42
|
|
@@ -1,9 +1,7 @@
|
|
1
1
|
require File.expand_path('../../spec_helper', __dir__)
|
2
2
|
|
3
3
|
describe FirebaseAdmin::Client do
|
4
|
-
|
5
|
-
@client = FirebaseAdmin::Client.new(project_id: 'test-project')
|
6
|
-
end
|
4
|
+
let(:client) { FirebaseAdmin::Client.new(project_id: 'test-project') }
|
7
5
|
|
8
6
|
describe '.create_account' do
|
9
7
|
before do
|
@@ -12,7 +10,7 @@ describe FirebaseAdmin::Client do
|
|
12
10
|
end
|
13
11
|
|
14
12
|
it 'should get the correct resource' do
|
15
|
-
|
13
|
+
client.create_account(email: 'john@smith.com', password: 'supersecret')
|
16
14
|
expect(
|
17
15
|
a_post('v1/projects/test-project/accounts')
|
18
16
|
.with(body: { email: 'john@smith.com', password: 'supersecret' }.to_json)
|
@@ -28,7 +26,7 @@ describe FirebaseAdmin::Client do
|
|
28
26
|
end
|
29
27
|
|
30
28
|
it 'should post to the update endpoint' do
|
31
|
-
|
29
|
+
client.update_account(email: 'john@smith.com', password: 'supersecret')
|
32
30
|
expect(
|
33
31
|
a_post('v1/projects/test-project/accounts:update')
|
34
32
|
.with(body: { email: 'john@smith.com', password: 'supersecret' }.to_json)
|
@@ -37,14 +35,31 @@ describe FirebaseAdmin::Client do
|
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
38
|
+
describe '.delete_account' do
|
39
|
+
before do
|
40
|
+
stub_post('v1/projects/test-project/accounts:delete')
|
41
|
+
.to_return(body: fixture('delete_account.json'), headers: { content_type: 'application/json; charset=utf-8' })
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should post to the delete endpoint' do
|
45
|
+
client.delete_account('local-id')
|
46
|
+
expect(
|
47
|
+
a_post('v1/projects/test-project/accounts:delete')
|
48
|
+
.with(body: { localId: 'local-id'}.to_json)
|
49
|
+
.with(headers: { 'Authorization' => 'Bearer owner' })
|
50
|
+
).to have_been_made
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
40
54
|
describe '.create_custom_token' do
|
41
55
|
context 'when credentials are set via GOOGLE_APPLICATION_CREDENTIALS' do
|
42
56
|
before do
|
43
57
|
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = fixture('google_credentials.json').path
|
58
|
+
FirebaseAdmin.reset
|
44
59
|
end
|
45
60
|
|
46
61
|
it 'returns a valid JWT token' do
|
47
|
-
token =
|
62
|
+
token = client.create_custom_token('user-123')
|
48
63
|
token_data, _alg = JWT.decode(token, nil, false)
|
49
64
|
expect(token_data['uid']).to eq('user-123')
|
50
65
|
end
|
@@ -53,10 +68,13 @@ describe FirebaseAdmin::Client do
|
|
53
68
|
context 'when GOOGLE_APPLICATION_CREDENTIALS points to an invalid file' do
|
54
69
|
before do
|
55
70
|
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = fixture('google_credentials_invalid.json').path
|
71
|
+
FirebaseAdmin.reset
|
56
72
|
end
|
57
73
|
|
58
74
|
it 'raises an error' do
|
59
|
-
expect {
|
75
|
+
expect {
|
76
|
+
client.create_custom_token('user-123')
|
77
|
+
}.to raise_error FirebaseAdmin::InvalidCredentials
|
60
78
|
end
|
61
79
|
end
|
62
80
|
|
@@ -68,10 +86,11 @@ describe FirebaseAdmin::Client do
|
|
68
86
|
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = nil
|
69
87
|
ENV['GOOGLE_CLIENT_EMAIL'] = email
|
70
88
|
ENV['GOOGLE_PRIVATE_KEY'] = private_key
|
89
|
+
FirebaseAdmin.reset
|
71
90
|
end
|
72
91
|
|
73
92
|
it 'returns a valid JWT token' do
|
74
|
-
token =
|
93
|
+
token = client.create_custom_token('user-123')
|
75
94
|
token_data, _alg = JWT.decode(token, nil, false)
|
76
95
|
expect(token_data['uid']).to eq('user-123')
|
77
96
|
end
|
@@ -82,19 +101,22 @@ describe FirebaseAdmin::Client do
|
|
82
101
|
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = nil
|
83
102
|
ENV['GOOGLE_CLIENT_EMAIL'] = nil
|
84
103
|
ENV['GOOGLE_PRIVATE_KEY'] = nil
|
104
|
+
FirebaseAdmin.reset
|
85
105
|
end
|
86
106
|
|
87
107
|
it 'raises an error' do
|
88
|
-
expect {
|
108
|
+
expect {
|
109
|
+
client.create_custom_token('user-123')
|
110
|
+
}.to raise_error FirebaseAdmin::InvalidCredentials
|
89
111
|
end
|
90
112
|
end
|
91
113
|
end
|
92
114
|
|
93
115
|
describe '.sign_in_for_uid' do
|
94
116
|
it 'should post to the update endpoint' do
|
95
|
-
expect(
|
96
|
-
expect(
|
97
|
-
result =
|
117
|
+
expect(client).to receive(:create_custom_token).with('user-123').and_return('token')
|
118
|
+
expect(client).to receive(:sign_in_with_custom_token).with('token').and_return('result')
|
119
|
+
result = client.sign_in_for_uid('user-123')
|
98
120
|
expect(result).to eq('result')
|
99
121
|
end
|
100
122
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{ "kind": "identitytoolkit#DeleteAccountResponse"}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: firebase-admin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Colin Harris
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -185,6 +185,7 @@ files:
|
|
185
185
|
- spec/fixtures/400_error.json
|
186
186
|
- spec/fixtures/bad_gateway.html
|
187
187
|
- spec/fixtures/create_account.json
|
188
|
+
- spec/fixtures/delete_account.json
|
188
189
|
- spec/fixtures/example_key
|
189
190
|
- spec/fixtures/gateway_timeout.html
|
190
191
|
- spec/fixtures/google_credentials.json
|
@@ -223,6 +224,7 @@ test_files:
|
|
223
224
|
- spec/fixtures/400_error.json
|
224
225
|
- spec/fixtures/bad_gateway.html
|
225
226
|
- spec/fixtures/create_account.json
|
227
|
+
- spec/fixtures/delete_account.json
|
226
228
|
- spec/fixtures/example_key
|
227
229
|
- spec/fixtures/gateway_timeout.html
|
228
230
|
- spec/fixtures/google_credentials.json
|