firebase-admin-sdk 0.1.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 +7 -0
- data/.github/workflows/main.yml +38 -0
- data/.gitignore +15 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +52 -0
- data/Rakefile +10 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/firebase-admin-sdk.gemspec +36 -0
- data/lib/firebase-admin-sdk.rb +17 -0
- data/lib/firebase/admin/app.rb +34 -0
- data/lib/firebase/admin/auth/certificates_fetcher.rb +62 -0
- data/lib/firebase/admin/auth/client.rb +116 -0
- data/lib/firebase/admin/auth/error.rb +23 -0
- data/lib/firebase/admin/auth/token_verifier.rb +114 -0
- data/lib/firebase/admin/auth/user_info.rb +60 -0
- data/lib/firebase/admin/auth/user_manager.rb +92 -0
- data/lib/firebase/admin/auth/user_record.rb +70 -0
- data/lib/firebase/admin/auth/utils.rb +93 -0
- data/lib/firebase/admin/config.rb +57 -0
- data/lib/firebase/admin/credentials.rb +79 -0
- data/lib/firebase/admin/error.rb +9 -0
- data/lib/firebase/admin/gce.rb +42 -0
- data/lib/firebase/admin/internal/http_client.rb +78 -0
- data/lib/firebase/admin/version.rb +7 -0
- metadata +230 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
require "json"
|
2
|
+
|
3
|
+
module Firebase
|
4
|
+
module Admin
|
5
|
+
# The name of the environment variable to lookup a Firebase config.
|
6
|
+
FIREBASE_CONFIG_ENV_VAR = "FIREBASE_CONFIG"
|
7
|
+
|
8
|
+
# Configuration options used to initialize an App.
|
9
|
+
class Config
|
10
|
+
attr_reader :project_id, :service_account_id
|
11
|
+
|
12
|
+
class << self
|
13
|
+
# Loads a configuration using the FIREBASE_CONFIG environment variable.
|
14
|
+
#
|
15
|
+
# If the value of the FIREBASE_CONFIG environment variable starts with "{" it is
|
16
|
+
# parsed as a JSON object, otherwise it is interpreted as a path to the config file.
|
17
|
+
#
|
18
|
+
# @return [Firebase::Admin::Config]
|
19
|
+
def from_env
|
20
|
+
config = ENV[FIREBASE_CONFIG_ENV_VAR]
|
21
|
+
return new if config.nil?
|
22
|
+
return from_json(config) if config.start_with?("{")
|
23
|
+
from_file(config)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Loads a configuration from a file.
|
27
|
+
#
|
28
|
+
# @param [File, String] file
|
29
|
+
# The path of the configuration file.
|
30
|
+
#
|
31
|
+
# @return [Firebase::Admin::Config]
|
32
|
+
def from_file(file)
|
33
|
+
json = file.is_a?(File) ? file.read : File.read(file)
|
34
|
+
from_json(json)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Loads a configuration from JSON.
|
38
|
+
#
|
39
|
+
# @param [String] json
|
40
|
+
# A configuration encoded as a JSON string.
|
41
|
+
#
|
42
|
+
# @return [Firebase::Admin::Config]
|
43
|
+
def from_json(json)
|
44
|
+
data = JSON.parse(json)
|
45
|
+
new(project_id: data["projectId"],
|
46
|
+
service_account_id: data["serviceAccountId"])
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Initializes the configuration object.
|
51
|
+
def initialize(project_id: nil, service_account_id: nil)
|
52
|
+
@project_id = project_id
|
53
|
+
@service_account_id = service_account_id
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require "stringio"
|
2
|
+
require "googleauth/default_credentials"
|
3
|
+
require "googleauth/application_default"
|
4
|
+
|
5
|
+
module Firebase
|
6
|
+
module Admin
|
7
|
+
SCOPE = %w[
|
8
|
+
https://www.googleapis.com/auth/cloud-platform
|
9
|
+
https://www.googleapis.com/auth/datastore
|
10
|
+
https://www.googleapis.com/auth/devstorage.read_write
|
11
|
+
https://www.googleapis.com/auth/firebase
|
12
|
+
https://www.googleapis.com/auth/identitytoolkit
|
13
|
+
https://www.googleapis.com/auth/userinfo.email
|
14
|
+
]
|
15
|
+
|
16
|
+
# Firebase credentials.
|
17
|
+
class Credentials
|
18
|
+
class << self
|
19
|
+
# Loads google credentials from a specified file path.
|
20
|
+
#
|
21
|
+
# @param [File, String] file
|
22
|
+
# The credentials file path
|
23
|
+
#
|
24
|
+
# @return [Firebase::Admin::Credentials]
|
25
|
+
def from_file(file)
|
26
|
+
json = file.is_a?(File) ? file.read : File.read(file)
|
27
|
+
from_json(json)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Loads google credentials from a JSON string.
|
31
|
+
#
|
32
|
+
# @param [String] json
|
33
|
+
# A JSON string containing valid google credentials.
|
34
|
+
#
|
35
|
+
# @return [Firebase::Admin::Credentials]
|
36
|
+
def from_json(json)
|
37
|
+
io = StringIO.new(json)
|
38
|
+
new(Google::Auth::DefaultCredentials.make_creds(scope: SCOPE, json_key_io: io))
|
39
|
+
end
|
40
|
+
|
41
|
+
# Loads application default credentials.
|
42
|
+
#
|
43
|
+
# @return [Firebase::Admin::Credentials]
|
44
|
+
def from_default
|
45
|
+
new(Google::Auth.get_application_default(SCOPE))
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Gets the google credentials
|
50
|
+
attr_reader :credentials
|
51
|
+
|
52
|
+
# Constructs a Credential from the specified Google Credentials.
|
53
|
+
#
|
54
|
+
# @param [Google::Auth::ServiceAccountCredentials, Google::Auth::UserRefreshCredentials, Google::Auth::GCECredentials] credentials
|
55
|
+
# The google credentials to connect with.
|
56
|
+
def initialize(credentials)
|
57
|
+
raise ArgumentError, "credentials cannot be nil" if credentials.nil?
|
58
|
+
@credentials = credentials
|
59
|
+
end
|
60
|
+
|
61
|
+
# Gets the google project id
|
62
|
+
def project_id
|
63
|
+
@credentials.project_id
|
64
|
+
end
|
65
|
+
|
66
|
+
# Apply the credentials
|
67
|
+
def apply!(hash, opts = {})
|
68
|
+
@credentials.apply!(hash, opts)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Firebase Admin emulator credentials.
|
73
|
+
class EmulatorCredentials
|
74
|
+
def apply!(hash, opts = {})
|
75
|
+
hash[:authorization] = "Bearer owner"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "faraday"
|
2
|
+
require "googleauth/compute_engine"
|
3
|
+
|
4
|
+
module Firebase
|
5
|
+
module Admin
|
6
|
+
module GCE
|
7
|
+
# The compute engine metadata project id endpoint.
|
8
|
+
PROJECT_ID_URI =
|
9
|
+
"#{Google::Auth::GCECredentials.compute_check_uri}/computeMetadata/v1/project/project-id".freeze
|
10
|
+
|
11
|
+
# Patches GCECredentials to lookup the project id using the metadata service when on compute engine.
|
12
|
+
class ::Google::Auth::GCECredentials
|
13
|
+
# The compute engine project id
|
14
|
+
def project_id
|
15
|
+
@project_id ||= fetch_project_id
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
# Fetches the project id using the compute engine metadata service.
|
21
|
+
def fetch_project_id
|
22
|
+
connection = build_default_connection || Faraday.default_connection
|
23
|
+
retry_with_error do
|
24
|
+
uri = Firebase::Admin::GCE::PROJECT_ID_URI
|
25
|
+
resp = connection.get(uri) do |req|
|
26
|
+
req.headers["Metadata-Flavor"] = "Google"
|
27
|
+
end
|
28
|
+
case resp.status
|
29
|
+
when 200
|
30
|
+
resp.body
|
31
|
+
when 404
|
32
|
+
raise Signet::AuthorizationError, NO_METADATA_SERVER_ERROR
|
33
|
+
else
|
34
|
+
msg = "Unexpected error code #{resp.status} #{UNEXPECTED_ERROR_SUFFIX}"
|
35
|
+
raise Signet::AuthorizationError, msg
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require "faraday"
|
2
|
+
require "faraday_middleware"
|
3
|
+
|
4
|
+
module Firebase
|
5
|
+
module Admin
|
6
|
+
module Internal
|
7
|
+
# A class to work with
|
8
|
+
class HTTPClient
|
9
|
+
# The admin sdk user agent.
|
10
|
+
USER_AGENT = "Firebase/HTTP/#{VERSION}/#{RUBY_VERSION}/AdminRuby"
|
11
|
+
|
12
|
+
def initialize(uri: nil, credentials: nil)
|
13
|
+
@uri = uri ? Faraday::Utils::URI(uri) : nil
|
14
|
+
@credentials = credentials
|
15
|
+
end
|
16
|
+
|
17
|
+
def head(url = nil, params = nil, headers = nil)
|
18
|
+
connection.head(url, params, headers)
|
19
|
+
end
|
20
|
+
|
21
|
+
def get(url = nil, params = nil, headers = nil)
|
22
|
+
connection.get(url, params, headers)
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete(url = nil, params = nil, headers = nil)
|
26
|
+
connection.delete(url, params, headers)
|
27
|
+
end
|
28
|
+
|
29
|
+
def trace(url = nil, params = nil, headers = nil)
|
30
|
+
connection.trace(url, params, headers)
|
31
|
+
end
|
32
|
+
|
33
|
+
def put(url = nil, params = nil, headers = nil)
|
34
|
+
connection.put(url, params, headers)
|
35
|
+
end
|
36
|
+
|
37
|
+
def post(url = nil, params = nil, headers = nil)
|
38
|
+
connection.post(url, params, headers)
|
39
|
+
end
|
40
|
+
|
41
|
+
def patch(url = nil, params = nil, headers = nil)
|
42
|
+
connection.patch(url, params, headers)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
# @return [Faraday::Connection]
|
48
|
+
def connection
|
49
|
+
options = {
|
50
|
+
headers: {
|
51
|
+
Accept: "application/json; charset=utf-8",
|
52
|
+
"Content-Type": "application/json; charset=utf-8",
|
53
|
+
"User-Agent": USER_AGENT
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
@connection ||= Faraday::Connection.new(@uri, options) do |c|
|
58
|
+
c.use CredentialsMiddleware, credentials: @credentials unless @credentials.nil?
|
59
|
+
c.use Faraday::Request::UrlEncoded
|
60
|
+
c.use FaradayMiddleware::EncodeJson
|
61
|
+
c.use Faraday::Response::ParseJson
|
62
|
+
c.use Faraday::Response::RaiseError
|
63
|
+
c.adapter(Faraday.default_adapter)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# Middleware for applying credentials to authenticate requests.
|
68
|
+
class CredentialsMiddleware < Faraday::Middleware
|
69
|
+
def on_request(env)
|
70
|
+
creds = options[:credentials]
|
71
|
+
creds.apply!(env[:request_headers])
|
72
|
+
end
|
73
|
+
end
|
74
|
+
private_constant :CredentialsMiddleware
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
metadata
ADDED
@@ -0,0 +1,230 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: firebase-admin-sdk
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tariq Zaid
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-06-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: googleauth
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.16.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.16.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "<"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "<"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: faraday_middleware
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: jwt
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.5'
|
62
|
+
- - "<"
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '3.0'
|
65
|
+
type: :runtime
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '1.5'
|
72
|
+
- - "<"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '3.0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rake
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '13.0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '13.0'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: rspec
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '3.0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '3.0'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: webmock
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '3.13'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '3.13'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: fakefs
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 1.3.2
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: 1.3.2
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
name: climate_control
|
133
|
+
requirement: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
type: :development
|
139
|
+
prerelease: false
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
145
|
+
- !ruby/object:Gem::Dependency
|
146
|
+
name: standard
|
147
|
+
requirement: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
type: :development
|
153
|
+
prerelease: false
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: activesupport
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
173
|
+
description:
|
174
|
+
email:
|
175
|
+
- tariq@cheddar.me
|
176
|
+
executables: []
|
177
|
+
extensions: []
|
178
|
+
extra_rdoc_files: []
|
179
|
+
files:
|
180
|
+
- ".github/workflows/main.yml"
|
181
|
+
- ".gitignore"
|
182
|
+
- ".rspec"
|
183
|
+
- ".ruby-version"
|
184
|
+
- Gemfile
|
185
|
+
- LICENSE.txt
|
186
|
+
- README.md
|
187
|
+
- Rakefile
|
188
|
+
- bin/console
|
189
|
+
- bin/setup
|
190
|
+
- firebase-admin-sdk.gemspec
|
191
|
+
- lib/firebase-admin-sdk.rb
|
192
|
+
- lib/firebase/admin/app.rb
|
193
|
+
- lib/firebase/admin/auth/certificates_fetcher.rb
|
194
|
+
- lib/firebase/admin/auth/client.rb
|
195
|
+
- lib/firebase/admin/auth/error.rb
|
196
|
+
- lib/firebase/admin/auth/token_verifier.rb
|
197
|
+
- lib/firebase/admin/auth/user_info.rb
|
198
|
+
- lib/firebase/admin/auth/user_manager.rb
|
199
|
+
- lib/firebase/admin/auth/user_record.rb
|
200
|
+
- lib/firebase/admin/auth/utils.rb
|
201
|
+
- lib/firebase/admin/config.rb
|
202
|
+
- lib/firebase/admin/credentials.rb
|
203
|
+
- lib/firebase/admin/error.rb
|
204
|
+
- lib/firebase/admin/gce.rb
|
205
|
+
- lib/firebase/admin/internal/http_client.rb
|
206
|
+
- lib/firebase/admin/version.rb
|
207
|
+
homepage: https://github.com/cheddar-me/firebase-admin-sdk-ruby
|
208
|
+
licenses:
|
209
|
+
- MIT
|
210
|
+
metadata: {}
|
211
|
+
post_install_message:
|
212
|
+
rdoc_options: []
|
213
|
+
require_paths:
|
214
|
+
- lib
|
215
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
216
|
+
requirements:
|
217
|
+
- - ">"
|
218
|
+
- !ruby/object:Gem::Version
|
219
|
+
version: '2.7'
|
220
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
221
|
+
requirements:
|
222
|
+
- - ">="
|
223
|
+
- !ruby/object:Gem::Version
|
224
|
+
version: '0'
|
225
|
+
requirements: []
|
226
|
+
rubygems_version: 3.2.15
|
227
|
+
signing_key:
|
228
|
+
specification_version: 4
|
229
|
+
summary: Firebase Admin SDK for Ruby
|
230
|
+
test_files: []
|