firebase-admin 0.1.1 → 0.1.5
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/Gemfile.lock +19 -5
- data/lib/firebase-admin/client/accounts.rb +46 -8
- data/lib/firebase-admin/connection.rb +1 -1
- data/lib/firebase-admin/error.rb +3 -0
- data/lib/firebase-admin/version.rb +1 -1
- data/spec/firebase-admin/client/accounts_spec.rb +78 -0
- data/spec/fixtures/example_key +1 -0
- data/spec/fixtures/google_credentials.json +12 -0
- data/spec/fixtures/google_credentials_invalid.json +1 -0
- data/spec/fixtures/update_account.json +6 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cef0674854fe33d6dd681638d9827eb360c8125922afd84d717072f3d2c0a359
|
4
|
+
data.tar.gz: 2729536a92a94c68cf977b608c8f948c4af965280b3820b3012bb882e774142c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd2bba2ad71b970ad58d1f6eda5cc5a82d39ebb21bbb7b3756c021af9cc541d7653f6bef9e36380ed6cae5a86d9aec498e6c169daa5741b8a3532313ca32257a
|
7
|
+
data.tar.gz: 7aafdeb40669eb59443585d1627ac29d7233f90b7ef09f195a918866908956c132ce7f7578628ee814dda51cc8e2cc0fd82ff5531189cae95ccf8ecf8637e2ec
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
firebase-admin (0.1.
|
4
|
+
firebase-admin (0.1.4)
|
5
5
|
addressable (~> 2.7)
|
6
6
|
faraday (~> 1.3)
|
7
7
|
faraday_middleware (~> 1.0)
|
@@ -18,11 +18,25 @@ GEM
|
|
18
18
|
crack (0.4.5)
|
19
19
|
rexml
|
20
20
|
diff-lcs (1.4.4)
|
21
|
-
faraday (1.
|
21
|
+
faraday (1.8.0)
|
22
|
+
faraday-em_http (~> 1.0)
|
23
|
+
faraday-em_synchrony (~> 1.0)
|
24
|
+
faraday-excon (~> 1.1)
|
25
|
+
faraday-httpclient (~> 1.0.1)
|
22
26
|
faraday-net_http (~> 1.0)
|
27
|
+
faraday-net_http_persistent (~> 1.1)
|
28
|
+
faraday-patron (~> 1.0)
|
29
|
+
faraday-rack (~> 1.0)
|
23
30
|
multipart-post (>= 1.2, < 3)
|
24
|
-
ruby2_keywords
|
31
|
+
ruby2_keywords (>= 0.0.4)
|
32
|
+
faraday-em_http (1.0.0)
|
33
|
+
faraday-em_synchrony (1.0.0)
|
34
|
+
faraday-excon (1.1.0)
|
35
|
+
faraday-httpclient (1.0.1)
|
25
36
|
faraday-net_http (1.0.1)
|
37
|
+
faraday-net_http_persistent (1.2.0)
|
38
|
+
faraday-patron (1.0.0)
|
39
|
+
faraday-rack (1.0.0)
|
26
40
|
faraday_middleware (1.0.0)
|
27
41
|
faraday (~> 1.0)
|
28
42
|
hashdiff (1.0.1)
|
@@ -63,7 +77,7 @@ GEM
|
|
63
77
|
rubocop-ast (1.4.1)
|
64
78
|
parser (>= 2.7.1.5)
|
65
79
|
ruby-progressbar (1.11.0)
|
66
|
-
ruby2_keywords (0.0.
|
80
|
+
ruby2_keywords (0.0.5)
|
67
81
|
unicode-display_width (2.0.0)
|
68
82
|
webmock (3.11.2)
|
69
83
|
addressable (>= 2.3.6)
|
@@ -81,4 +95,4 @@ DEPENDENCIES
|
|
81
95
|
webmock (~> 3.11)
|
82
96
|
|
83
97
|
BUNDLED WITH
|
84
|
-
2.2.
|
98
|
+
2.2.22
|
@@ -93,6 +93,20 @@ module FirebaseAdmin
|
|
93
93
|
post('v1/accounts:signInWithCustomToken', { token: token, returnSecureToken: true })
|
94
94
|
end
|
95
95
|
|
96
|
+
# Sign in based on the UID of an account
|
97
|
+
# This generates a custom token for the UID and signs in using the custom token
|
98
|
+
#
|
99
|
+
# @param uid [String] The uid of a user
|
100
|
+
#
|
101
|
+
# @return [Resource] with idToken
|
102
|
+
#
|
103
|
+
# @example
|
104
|
+
# FirebaseAdmin.sign_in_for_uid("...")
|
105
|
+
def sign_in_for_uid(uid)
|
106
|
+
custom_token = create_custom_token(uid)
|
107
|
+
sign_in_with_custom_token(custom_token)
|
108
|
+
end
|
109
|
+
|
96
110
|
# Create a custom JWT token for a UID
|
97
111
|
#
|
98
112
|
# @param uid [String] The uid of a user
|
@@ -103,11 +117,6 @@ module FirebaseAdmin
|
|
103
117
|
# @example
|
104
118
|
# FirebaseAdmin.create_custom_token('...')
|
105
119
|
def create_custom_token(uid)
|
106
|
-
credentials = default_credentials
|
107
|
-
|
108
|
-
service_account_email = credentials.fetch('client_email', ENV['GOOGLE_CLIENT_EMAIL'])
|
109
|
-
private_key = OpenSSL::PKey::RSA.new credentials.fetch('private_key', unescape(ENV['GOOGLE_PRIVATE_KEY']))
|
110
|
-
|
111
120
|
now_seconds = Time.now.to_i
|
112
121
|
payload = {
|
113
122
|
iss: service_account_email,
|
@@ -118,7 +127,6 @@ module FirebaseAdmin
|
|
118
127
|
uid: uid
|
119
128
|
}
|
120
129
|
JWT.encode(payload, private_key, 'RS256')
|
121
|
-
JWT.decode()
|
122
130
|
end
|
123
131
|
|
124
132
|
# Get user by email/phone/uid
|
@@ -156,10 +164,40 @@ module FirebaseAdmin
|
|
156
164
|
str
|
157
165
|
end
|
158
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
|
+
|
159
187
|
def default_credentials
|
160
|
-
|
188
|
+
@default_credentials ||= read_default_credentials
|
189
|
+
end
|
161
190
|
|
162
|
-
|
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}"
|
163
201
|
end
|
164
202
|
end
|
165
203
|
end
|
@@ -17,7 +17,7 @@ module FirebaseAdmin
|
|
17
17
|
}.merge(connection_options)
|
18
18
|
|
19
19
|
Faraday::Connection.new(options) do |connection|
|
20
|
-
connection.authorization
|
20
|
+
connection.request :authorization, 'Bearer', access_token if access_token
|
21
21
|
connection.use Faraday::Request::UrlEncoded
|
22
22
|
connection.use FaradayMiddleware::Mashify
|
23
23
|
connection.use Faraday::Response::ParseJson
|
data/lib/firebase-admin/error.rb
CHANGED
@@ -20,4 +20,82 @@ describe FirebaseAdmin::Client do
|
|
20
20
|
).to have_been_made
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
describe '.update_account' do
|
25
|
+
before do
|
26
|
+
stub_post('v1/projects/test-project/accounts:update')
|
27
|
+
.to_return(body: fixture('update_account.json'), headers: { content_type: 'application/json; charset=utf-8' })
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should post to the update endpoint' do
|
31
|
+
@client.update_account(email: 'john@smith.com', password: 'supersecret')
|
32
|
+
expect(
|
33
|
+
a_post('v1/projects/test-project/accounts:update')
|
34
|
+
.with(body: { email: 'john@smith.com', password: 'supersecret' }.to_json)
|
35
|
+
.with(headers: { 'Authorization' => 'Bearer owner' })
|
36
|
+
).to have_been_made
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '.create_custom_token' do
|
41
|
+
context 'when credentials are set via GOOGLE_APPLICATION_CREDENTIALS' do
|
42
|
+
before do
|
43
|
+
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = fixture('google_credentials.json').path
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'returns a valid JWT token' do
|
47
|
+
token = @client.create_custom_token('user-123')
|
48
|
+
token_data, _alg = JWT.decode(token, nil, false)
|
49
|
+
expect(token_data['uid']).to eq('user-123')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'when GOOGLE_APPLICATION_CREDENTIALS points to an invalid file' do
|
54
|
+
before do
|
55
|
+
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = fixture('google_credentials_invalid.json').path
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'raises an error' do
|
59
|
+
expect { @client.create_custom_token('user-123') }.to raise_error FirebaseAdmin::InvalidCredentials
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'when credentials are set via GOOGLE_CLIENT_EMAIL / GOOGLE_PRIVATE_KEY' do
|
64
|
+
let(:email) { 'example@example.com' }
|
65
|
+
let(:private_key) { fixture('example_key').read }
|
66
|
+
|
67
|
+
before do
|
68
|
+
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = nil
|
69
|
+
ENV['GOOGLE_CLIENT_EMAIL'] = email
|
70
|
+
ENV['GOOGLE_PRIVATE_KEY'] = private_key
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'returns a valid JWT token' do
|
74
|
+
token = @client.create_custom_token('user-123')
|
75
|
+
token_data, _alg = JWT.decode(token, nil, false)
|
76
|
+
expect(token_data['uid']).to eq('user-123')
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'when no credentials are provided' do
|
81
|
+
before do
|
82
|
+
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = nil
|
83
|
+
ENV['GOOGLE_CLIENT_EMAIL'] = nil
|
84
|
+
ENV['GOOGLE_PRIVATE_KEY'] = nil
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'raises an error' do
|
88
|
+
expect { @client.create_custom_token('user-123') }.to raise_error FirebaseAdmin::InvalidCredentials
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe '.sign_in_for_uid' do
|
94
|
+
it 'should post to the update endpoint' do
|
95
|
+
expect(@client).to receive(:create_custom_token).with('user-123').and_return('token')
|
96
|
+
expect(@client).to receive(:sign_in_with_custom_token).with('token').and_return('result')
|
97
|
+
result = @client.sign_in_for_uid('user-123')
|
98
|
+
expect(result).to eq('result')
|
99
|
+
end
|
100
|
+
end
|
23
101
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDW04sWbA5qIYUQ\nLU+dVoEf0ipYYmu9/2Z+Teobkhd9f6ZQ++1a0hnpelIx3vulrO0uPU/CZIh75cPR\nl/UGg2wxB2QnQcznUCJylOKoV412L7nTauYolNkI71X95npQyQtP+i3E7mQHAEJc\nOqF+cd6ufH5KouKtkJvSioHVKMr1YWDAmCfvQdYQ9Chv4K3Fvr1yniFk7OqcB1Td\nf9XcMpCaC6XokOzgvZ0TbNoqG2ceR66E04J33nRenqiRv8I/jmzsvYb692CuzKEL\nf/F4eY8bnIRYrMgT+7qgBkLMbNN/7m95uoBvJASvosx9+Fp3h6q9DhdphyV0iFjL\nHtvFpH1PAgMBAAECggEACJhCEk2Ubg6VQkZtzv+s/tbrtsmJQfq74QXA/gVkRzMa\nNlc98cpCGyM3sqMXMlOu0ZDGZiKbi0lwAiywMuiDJZsEGMX7Kq38EtV+E/ocwMO8\nDYdTWgBKhp78s8HK1vyUJUj/F8fp3JXYEdSOrX5kyFpWuym1I/iLI2tDMoIFTLfb\n3+NGAZQti7jXO8HMPTBhTj9X4wunCHucc6zd7QwRMmAyNITK+q9gOWoH3ruhN0/h\nj58USy5CuUAXuhQWoNxUPZlUiXg7ei2bSTH+tMBoCyqcDi4TKEXAHKXKS5Fd5he4\nXOQVsobqwCDKCoVGoaH+QdSru7TLVWqRox0RQY/NkQKBgQDwOXI2zQsrVnrSqS+X\nl0r+G21H5NkjjY5x1aOAG0BIBW6OK5MAbP1bUbOVA00hfey2kaSR69/7px134Lsi\ntgC9JziyjIpyS6yMlYisTKuqg3SY1GjKkGrZkdCO+xcY/Jiamo6VNGzuwJzmjWQ5\n3cfaZDcgo/4bqtGI9QbQ6rW06wKBgQDk7x2OPlCHMusVq0DOa7TraRelhTMDYco5\nNvzJ8r27W0NoHrmgvPFgVkzE+rkwDf2LO5D5TwPyzw1+lnqxaNmKF2EU/OXoGTUG\ntqu1xPu0NXr8bZn5YRwR1Zc+6cbXqUFIm5BtBlKXfc+Yrg7XFw1Y28aakSa3Kvft\n8GL9g+8QLQKBgQCdDvH9olGLJB9pW/QhyGjfek8Ykibld8eJ5YPgXfDJJcQCb7rM\nrHV5HxGqe14SZ6I8Ozy9qtnmTnyVw/iV2SjigqIvGnPqBk/qGlohTH9wHEI/KaDZ\nz1IMrakN0lxnmb6sViCirIQMFSKAGjFNJBNmVd81GAMrU6NrR8gND2d9wQKBgEbF\ntPlYQkTJdOtJ+crWeSOdZXYB63dML9voJ9W2ePkGiZwSg4gxYN1LUIhEiiNU7+Cv\nFW49Axd48s8DbgKSS03pVFXMqLZLtJzSs9qJftaDAfYvW75ASxEoWo1Ub+gTpt7v\nWIKbxcSXXCnzBRtxQOsLZiY6YSGW4vZnrfJ5atoxAoGBAJF9oxseUWLFi8G9jaMD\nBnGqha7wCrQE6rFjgG9olbYxVB0IYN6hnPoelkrJWDJDz9bpvXSsbO7lwFv0x3Ks\n6ehj1fDjibTz9BNiqNwFzoPWq4Th2TqHrYY34ohtcW4tQdtLYPgQyhmNASUytAlG\nzipYnskyVze/3An/VEFrhSdy\n-----END PRIVATE KEY-----\n
|
@@ -0,0 +1,12 @@
|
|
1
|
+
{
|
2
|
+
"type": "service_account",
|
3
|
+
"project_id": "example-project",
|
4
|
+
"private_key_id": "123",
|
5
|
+
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDW04sWbA5qIYUQ\nLU+dVoEf0ipYYmu9/2Z+Teobkhd9f6ZQ++1a0hnpelIx3vulrO0uPU/CZIh75cPR\nl/UGg2wxB2QnQcznUCJylOKoV412L7nTauYolNkI71X95npQyQtP+i3E7mQHAEJc\nOqF+cd6ufH5KouKtkJvSioHVKMr1YWDAmCfvQdYQ9Chv4K3Fvr1yniFk7OqcB1Td\nf9XcMpCaC6XokOzgvZ0TbNoqG2ceR66E04J33nRenqiRv8I/jmzsvYb692CuzKEL\nf/F4eY8bnIRYrMgT+7qgBkLMbNN/7m95uoBvJASvosx9+Fp3h6q9DhdphyV0iFjL\nHtvFpH1PAgMBAAECggEACJhCEk2Ubg6VQkZtzv+s/tbrtsmJQfq74QXA/gVkRzMa\nNlc98cpCGyM3sqMXMlOu0ZDGZiKbi0lwAiywMuiDJZsEGMX7Kq38EtV+E/ocwMO8\nDYdTWgBKhp78s8HK1vyUJUj/F8fp3JXYEdSOrX5kyFpWuym1I/iLI2tDMoIFTLfb\n3+NGAZQti7jXO8HMPTBhTj9X4wunCHucc6zd7QwRMmAyNITK+q9gOWoH3ruhN0/h\nj58USy5CuUAXuhQWoNxUPZlUiXg7ei2bSTH+tMBoCyqcDi4TKEXAHKXKS5Fd5he4\nXOQVsobqwCDKCoVGoaH+QdSru7TLVWqRox0RQY/NkQKBgQDwOXI2zQsrVnrSqS+X\nl0r+G21H5NkjjY5x1aOAG0BIBW6OK5MAbP1bUbOVA00hfey2kaSR69/7px134Lsi\ntgC9JziyjIpyS6yMlYisTKuqg3SY1GjKkGrZkdCO+xcY/Jiamo6VNGzuwJzmjWQ5\n3cfaZDcgo/4bqtGI9QbQ6rW06wKBgQDk7x2OPlCHMusVq0DOa7TraRelhTMDYco5\nNvzJ8r27W0NoHrmgvPFgVkzE+rkwDf2LO5D5TwPyzw1+lnqxaNmKF2EU/OXoGTUG\ntqu1xPu0NXr8bZn5YRwR1Zc+6cbXqUFIm5BtBlKXfc+Yrg7XFw1Y28aakSa3Kvft\n8GL9g+8QLQKBgQCdDvH9olGLJB9pW/QhyGjfek8Ykibld8eJ5YPgXfDJJcQCb7rM\nrHV5HxGqe14SZ6I8Ozy9qtnmTnyVw/iV2SjigqIvGnPqBk/qGlohTH9wHEI/KaDZ\nz1IMrakN0lxnmb6sViCirIQMFSKAGjFNJBNmVd81GAMrU6NrR8gND2d9wQKBgEbF\ntPlYQkTJdOtJ+crWeSOdZXYB63dML9voJ9W2ePkGiZwSg4gxYN1LUIhEiiNU7+Cv\nFW49Axd48s8DbgKSS03pVFXMqLZLtJzSs9qJftaDAfYvW75ASxEoWo1Ub+gTpt7v\nWIKbxcSXXCnzBRtxQOsLZiY6YSGW4vZnrfJ5atoxAoGBAJF9oxseUWLFi8G9jaMD\nBnGqha7wCrQE6rFjgG9olbYxVB0IYN6hnPoelkrJWDJDz9bpvXSsbO7lwFv0x3Ks\n6ehj1fDjibTz9BNiqNwFzoPWq4Th2TqHrYY34ohtcW4tQdtLYPgQyhmNASUytAlG\nzipYnskyVze/3An/VEFrhSdy\n-----END PRIVATE KEY-----\n",
|
6
|
+
"client_email": "example@example.iam.gserviceaccount.com",
|
7
|
+
"client_id": "456",
|
8
|
+
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
9
|
+
"token_uri": "https://oauth2.googleapis.com/token",
|
10
|
+
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
11
|
+
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/example%40example.iam.gserviceaccount.com"
|
12
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
invalid
|
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.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Colin Harris
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -185,7 +185,11 @@ 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/example_key
|
188
189
|
- spec/fixtures/gateway_timeout.html
|
190
|
+
- spec/fixtures/google_credentials.json
|
191
|
+
- spec/fixtures/google_credentials_invalid.json
|
192
|
+
- spec/fixtures/update_account.json
|
189
193
|
- spec/spec_helper.rb
|
190
194
|
homepage: https://github.com/col/firebase-admin
|
191
195
|
licenses:
|
@@ -219,5 +223,9 @@ test_files:
|
|
219
223
|
- spec/fixtures/400_error.json
|
220
224
|
- spec/fixtures/bad_gateway.html
|
221
225
|
- spec/fixtures/create_account.json
|
226
|
+
- spec/fixtures/example_key
|
222
227
|
- spec/fixtures/gateway_timeout.html
|
228
|
+
- spec/fixtures/google_credentials.json
|
229
|
+
- spec/fixtures/google_credentials_invalid.json
|
230
|
+
- spec/fixtures/update_account.json
|
223
231
|
- spec/spec_helper.rb
|