Skip to content

Commit 9d845ea

Browse files
authored
Automatic anonymous authentication (#172)
* fix #126 * update README * fix query and list signal connections inverted, fix query request * fix query response handling * add prettified _to_string method to print queries * add automatic anonymous authentication * Update override.cfg * Update project.godot * Update firestore.gd
1 parent 755875a commit 9d845ea

File tree

5 files changed

+72
-63
lines changed

5 files changed

+72
-63
lines changed

addons/godot-firebase/auth/auth.gd

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
## @meta-authors TODO
2-
## @meta-version 2.3
2+
## @meta-version 2.4
33
## The authentication API for Firebase.
44
## Documentation TODO.
55
tool
66
class_name FirebaseAuth
77
extends HTTPRequest
88

9+
# Emitted for each Auth request issued.
10+
# `result_code` -> Either `1` if auth succeeded or `error_code` if unsuccessful auth request
11+
# `result_content` -> Either `auth_result` if auth succeeded or `error_message` if unsuccessful auth request
12+
signal auth_request(result_code, result_content)
13+
914
signal signup_succeeded(auth_result)
1015
signal login_succeeded(auth_result)
1116
signal login_failed(code, message)
@@ -261,13 +266,16 @@ func _on_FirebaseAuth_request_completed(result : int, response_code : int, heade
261266
RESPONSE_USERDATA:
262267
var userdata = FirebaseUserData.new(res.users[0])
263268
emit_signal("userdata_received", userdata)
269+
emit_signal("auth_request", 1, auth)
264270
else:
265271
# error message would be INVALID_EMAIL, EMAIL_NOT_FOUND, INVALID_PASSWORD, USER_DISABLED or WEAK_PASSWORD
266272
if requesting == Requests.EXCHANGE_TOKEN:
267273
emit_signal("token_exchanged", false)
268274
emit_signal("login_failed", res.error, res.error_description)
275+
emit_signal("auth_request", res.error, res.error_description)
269276
else:
270277
emit_signal("login_failed", res.error.code, res.error.message)
278+
emit_signal("auth_request", res.error.code, res.error.message)
271279
requesting = Requests.NONE
272280

273281
# Function used to save the auth data provided by Firebase into an encrypted file

addons/godot-firebase/firebase/firebase.gd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,4 @@ func _load_config() -> void:
7272
printerr("Configuration key '{key}' not found!".format({key = key}))
7373
else:
7474
printerr("No configuration settings found, add them in override.cfg file.")
75+
print("")

addons/godot-firebase/firestore/firestore.gd

Lines changed: 50 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
## @meta-authors Nicolò 'fenix' Santilio,
2-
## @meta-version 2.4
2+
## @meta-version 2.5
33
##
44
## Referenced by [code]Firebase.Firestore[/code]. Represents the Firestore module.
55
## Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.
@@ -144,25 +144,19 @@ func collection(path : String) -> FirestoreCollection:
144144
## @arg-types FirestoreQuery
145145
## @return FirestoreTask
146146
func query(query : FirestoreQuery) -> FirestoreTask:
147-
if auth:
148-
var firestore_task : FirestoreTask = FirestoreTask.new()
149-
firestore_task.connect("result_query", self, "_on_result_query")
150-
firestore_task.connect("task_error", self, "_on_task_error")
151-
firestore_task.connect("task_list_error", self, "_on_task_list_error")
152-
firestore_task.connect("task_query_error", self, "_on_task_query_error")
153-
firestore_task.action = FirestoreTask.Task.TASK_QUERY
154-
var body : Dictionary = { structuredQuery = query.query }
155-
var url : String = _base_url + _extended_url + _query_suffix
156-
157-
firestore_task.data = query
158-
firestore_task._fields = JSON.print(body)
159-
firestore_task._url = url
160-
firestore_task._headers = PoolStringArray([_AUTHORIZATION_HEADER + auth.idtoken])
161-
_pooled_request(firestore_task)
162-
return firestore_task
163-
else:
164-
printerr("Unauthorized")
165-
return null
147+
var firestore_task : FirestoreTask = FirestoreTask.new()
148+
firestore_task.connect("result_query", self, "_on_result_query")
149+
firestore_task.connect("task_error", self, "_on_task_error")
150+
firestore_task.connect("task_query_error", self, "_on_task_query_error")
151+
firestore_task.action = FirestoreTask.Task.TASK_QUERY
152+
var body : Dictionary = { structuredQuery = query.query }
153+
var url : String = _base_url + _extended_url + _query_suffix
154+
155+
firestore_task.data = query
156+
firestore_task._fields = JSON.print(body)
157+
firestore_task._url = url
158+
_pooled_request(firestore_task)
159+
return firestore_task
166160

167161

168162
## Request a list of contents (documents and/or collections) inside a collection, specified by its [i]id[/i]. This method will return a [code]FirestoreTask[/code] object, representing a reference to the request issued. If saved into a variable, the [code]FirestoreTask[/code] object can be used to yield on the [code]result_query(result)[/code] signal, or the more generic [code]task_finished(result)[/code] signal.
@@ -180,31 +174,27 @@ func query(query : FirestoreQuery) -> FirestoreTask:
180174
## @arg-defaults , 0, "", ""
181175
## @return FirestoreTask
182176
func list(path : String, page_size : int = 0, page_token : String = "", order_by : String = "") -> FirestoreTask:
183-
if auth:
184-
var firestore_task : FirestoreTask = FirestoreTask.new()
185-
firestore_task.connect("listed_documents", self, "_on_listed_documents")
186-
firestore_task.connect("error", self, "_on_error")
187-
firestore_task.action = FirestoreTask.Task.TASK_LIST
188-
var url : String
189-
if not path in [""," "]:
190-
url = _base_url + _extended_url + path + "/"
191-
else:
192-
url = _base_url + _extended_url
193-
if page_size != 0:
194-
url+="?pageSize="+str(page_size)
195-
if page_token != "":
196-
url+="&pageToken="+page_token
197-
if order_by != "":
198-
url+="&orderBy="+order_by
199-
200-
firestore_task.data = [path, page_size, page_token, order_by]
201-
firestore_task._url = url
202-
firestore_task._headers = PoolStringArray([_AUTHORIZATION_HEADER + auth.idtoken])
203-
_pooled_request(firestore_task)
204-
return firestore_task
177+
var firestore_task : FirestoreTask = FirestoreTask.new()
178+
firestore_task.connect("listed_documents", self, "_on_listed_documents")
179+
firestore_task.connect("task_error", self, "_on_task_error")
180+
firestore_task.connect("task_list_error", self, "_on_task_list_error")
181+
firestore_task.action = FirestoreTask.Task.TASK_LIST
182+
var url : String
183+
if not path in [""," "]:
184+
url = _base_url + _extended_url + path + "/"
205185
else:
206-
printerr("Unauthorized")
207-
return null
186+
url = _base_url + _extended_url
187+
if page_size != 0:
188+
url+="?pageSize="+str(page_size)
189+
if page_token != "":
190+
url+="&pageToken="+page_token
191+
if order_by != "":
192+
url+="&orderBy="+order_by
193+
194+
firestore_task.data = [path, page_size, page_token, order_by]
195+
firestore_task._url = url
196+
_pooled_request(firestore_task)
197+
return firestore_task
208198

209199

210200
func set_networking(value: bool) -> void:
@@ -310,6 +300,16 @@ func _pooled_request(task : FirestoreTask) -> void:
310300
task._on_request_completed(HTTPRequest.RESULT_CANT_CONNECT, 404, PoolStringArray(), PoolByteArray())
311301
return
312302

303+
if not auth:
304+
printerr("Unauthenticated request issued...")
305+
Firebase.Auth.login_anonymous()
306+
var result : Array = yield(Firebase.Auth, "auth_request")
307+
if result[0] != 1:
308+
_check_auth_error(result[0], result[1])
309+
printerr("Client connected as Anonymous")
310+
311+
task._headers = PoolStringArray([_AUTHORIZATION_HEADER + auth.idtoken])
312+
313313
var http_request : HTTPRequest
314314
for request in _http_request_pool:
315315
if not request.get_meta("requesting"):
@@ -380,3 +380,9 @@ func _on_connect_check_request_completed(result : int, _response_code, _headers,
380380

381381
func _on_FirebaseAuth_logout() -> void:
382382
auth = {}
383+
384+
func _check_auth_error(code : int, message : String) -> void:
385+
var err : String
386+
match code:
387+
400: err = "Please, enable Anonymous Sign-in method or Authenticate the Client before issuing a request (best option)"
388+
printerr(err)

addons/godot-firebase/firestore/firestore_collection.gd

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
## @meta-authors TODO
2-
## @meta-version 2.2
2+
## @meta-version 2.3
33
## A reference to a Firestore Collection.
44
## Documentation TODO.
55
tool
@@ -35,10 +35,6 @@ var _request_queues := {}
3535
## @return FirestoreTask
3636
## used to GET a document from the collection, specify @document_id
3737
func get(document_id : String) -> FirestoreTask:
38-
if not auth:
39-
printerr("Unauthorized Firestore operation!")
40-
return null
41-
4238
var task : FirestoreTask = FirestoreTask.new()
4339
task.action = FirestoreTask.Task.TASK_GET
4440
task.data = collection_name + "/" + document_id
@@ -54,10 +50,6 @@ func get(document_id : String) -> FirestoreTask:
5450
## @return FirestoreTask
5551
## used to SAVE/ADD a new document to the collection, specify @documentID and @fields
5652
func add(document_id : String, fields : Dictionary = {}) -> FirestoreTask:
57-
if not auth:
58-
printerr("Unauthorized Firestore operation!")
59-
return null
60-
6153
var task : FirestoreTask = FirestoreTask.new()
6254
task.action = FirestoreTask.Task.TASK_POST
6355
task.data = collection_name + "/" + document_id
@@ -73,10 +65,6 @@ func add(document_id : String, fields : Dictionary = {}) -> FirestoreTask:
7365
## @return FirestoreTask
7466
# used to UPDATE a document, specify @documentID and @fields
7567
func update(document_id : String, fields : Dictionary = {}) -> FirestoreTask:
76-
if not auth:
77-
printerr("Unauthorized Firestore operation!")
78-
return null
79-
8068
var task : FirestoreTask = FirestoreTask.new()
8169
task.action = FirestoreTask.Task.TASK_PATCH
8270
task.data = collection_name + "/" + document_id
@@ -94,10 +82,6 @@ func update(document_id : String, fields : Dictionary = {}) -> FirestoreTask:
9482
## @return FirestoreTask
9583
# used to DELETE a document, specify @document_id
9684
func delete(document_id : String) -> FirestoreTask:
97-
if not auth:
98-
printerr("Unauthorized Firestore operation!")
99-
return null
100-
10185
var task : FirestoreTask = FirestoreTask.new()
10286
task.action = FirestoreTask.Task.TASK_DELETE
10387
task.data = collection_name + "/" + document_id
@@ -115,6 +99,16 @@ func _get_request_url() -> String:
11599

116100
func _process_request(task : FirestoreTask, document_id : String, url : String, fields := "") -> void:
117101
task.connect("task_error", self, "_on_error")
102+
103+
if not auth:
104+
printerr("Unauthenticated request issued...")
105+
Firebase.Auth.login_anonymous()
106+
var result : Array = yield(Firebase.Auth, "auth_request")
107+
if result[0] != 1:
108+
Firebase.Firestore._check_auth_error(result[0], result[1])
109+
return null
110+
printerr("Client authenticated as Anonymous User.")
111+
118112
task._url = url
119113
task._fields = fields
120114
task._headers = PoolStringArray([_AUTHORIZATION_HEADER + auth.idtoken])

override.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ appId=""
1010
measurementId=""
1111
clientId=""
1212
clientSecret=""
13-
domainUriPrefix=""
13+
domainUriPrefix=""

0 commit comments

Comments
 (0)