Skip to content
10 changes: 9 additions & 1 deletion addons/godot-firebase/auth/auth.gd
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
## @meta-authors TODO
## @meta-version 2.3
## @meta-version 2.4
## The authentication API for Firebase.
## Documentation TODO.
tool
class_name FirebaseAuth
extends HTTPRequest

# Emitted for each Auth request issued.
# `result_code` -> Either `1` if auth succeeded or `error_code` if unsuccessful auth request
# `result_content` -> Either `auth_result` if auth succeeded or `error_message` if unsuccessful auth request
signal auth_request(result_code, result_content)

signal signup_succeeded(auth_result)
signal login_succeeded(auth_result)
signal login_failed(code, message)
Expand Down Expand Up @@ -261,13 +266,16 @@ func _on_FirebaseAuth_request_completed(result : int, response_code : int, heade
RESPONSE_USERDATA:
var userdata = FirebaseUserData.new(res.users[0])
emit_signal("userdata_received", userdata)
emit_signal("auth_request", 1, auth)
else:
# error message would be INVALID_EMAIL, EMAIL_NOT_FOUND, INVALID_PASSWORD, USER_DISABLED or WEAK_PASSWORD
if requesting == Requests.EXCHANGE_TOKEN:
emit_signal("token_exchanged", false)
emit_signal("login_failed", res.error, res.error_description)
emit_signal("auth_request", res.error, res.error_description)
else:
emit_signal("login_failed", res.error.code, res.error.message)
emit_signal("auth_request", res.error.code, res.error.message)
requesting = Requests.NONE

# Function used to save the auth data provided by Firebase into an encrypted file
Expand Down
1 change: 1 addition & 0 deletions addons/godot-firebase/firebase/firebase.gd
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,4 @@ func _load_config() -> void:
printerr("Configuration key '{key}' not found!".format({key = key}))
else:
printerr("No configuration settings found, add them in override.cfg file.")
print("")
94 changes: 50 additions & 44 deletions addons/godot-firebase/firestore/firestore.gd
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
## @meta-authors Nicolò 'fenix' Santilio,
## @meta-version 2.4
## @meta-version 2.5
##
## Referenced by [code]Firebase.Firestore[/code]. Represents the Firestore module.
## Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.
Expand Down Expand Up @@ -144,25 +144,19 @@ func collection(path : String) -> FirestoreCollection:
## @arg-types FirestoreQuery
## @return FirestoreTask
func query(query : FirestoreQuery) -> FirestoreTask:
if auth:
var firestore_task : FirestoreTask = FirestoreTask.new()
firestore_task.connect("result_query", self, "_on_result_query")
firestore_task.connect("task_error", self, "_on_task_error")
firestore_task.connect("task_list_error", self, "_on_task_list_error")
firestore_task.connect("task_query_error", self, "_on_task_query_error")
firestore_task.action = FirestoreTask.Task.TASK_QUERY
var body : Dictionary = { structuredQuery = query.query }
var url : String = _base_url + _extended_url + _query_suffix

firestore_task.data = query
firestore_task._fields = JSON.print(body)
firestore_task._url = url
firestore_task._headers = PoolStringArray([_AUTHORIZATION_HEADER + auth.idtoken])
_pooled_request(firestore_task)
return firestore_task
else:
printerr("Unauthorized")
return null
var firestore_task : FirestoreTask = FirestoreTask.new()
firestore_task.connect("result_query", self, "_on_result_query")
firestore_task.connect("task_error", self, "_on_task_error")
firestore_task.connect("task_query_error", self, "_on_task_query_error")
firestore_task.action = FirestoreTask.Task.TASK_QUERY
var body : Dictionary = { structuredQuery = query.query }
var url : String = _base_url + _extended_url + _query_suffix

firestore_task.data = query
firestore_task._fields = JSON.print(body)
firestore_task._url = url
_pooled_request(firestore_task)
return firestore_task


## 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.
Expand All @@ -180,31 +174,27 @@ func query(query : FirestoreQuery) -> FirestoreTask:
## @arg-defaults , 0, "", ""
## @return FirestoreTask
func list(path : String, page_size : int = 0, page_token : String = "", order_by : String = "") -> FirestoreTask:
if auth:
var firestore_task : FirestoreTask = FirestoreTask.new()
firestore_task.connect("listed_documents", self, "_on_listed_documents")
firestore_task.connect("error", self, "_on_error")
firestore_task.action = FirestoreTask.Task.TASK_LIST
var url : String
if not path in [""," "]:
url = _base_url + _extended_url + path + "/"
else:
url = _base_url + _extended_url
if page_size != 0:
url+="?pageSize="+str(page_size)
if page_token != "":
url+="&pageToken="+page_token
if order_by != "":
url+="&orderBy="+order_by

firestore_task.data = [path, page_size, page_token, order_by]
firestore_task._url = url
firestore_task._headers = PoolStringArray([_AUTHORIZATION_HEADER + auth.idtoken])
_pooled_request(firestore_task)
return firestore_task
var firestore_task : FirestoreTask = FirestoreTask.new()
firestore_task.connect("listed_documents", self, "_on_listed_documents")
firestore_task.connect("task_error", self, "_on_task_error")
firestore_task.connect("task_list_error", self, "_on_task_list_error")
firestore_task.action = FirestoreTask.Task.TASK_LIST
var url : String
if not path in [""," "]:
url = _base_url + _extended_url + path + "/"
else:
printerr("Unauthorized")
return null
url = _base_url + _extended_url
if page_size != 0:
url+="?pageSize="+str(page_size)
if page_token != "":
url+="&pageToken="+page_token
if order_by != "":
url+="&orderBy="+order_by

firestore_task.data = [path, page_size, page_token, order_by]
firestore_task._url = url
_pooled_request(firestore_task)
return firestore_task


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

if not auth:
printerr("Unauthenticated request issued...")
Firebase.Auth.login_anonymous()
var result : Array = yield(Firebase.Auth, "auth_request")
if result[0] != 1:
_check_auth_error(result[0], result[1])
printerr("Client connected as Anonymous")

task._headers = PoolStringArray([_AUTHORIZATION_HEADER + auth.idtoken])

var http_request : HTTPRequest
for request in _http_request_pool:
if not request.get_meta("requesting"):
Expand Down Expand Up @@ -380,3 +380,9 @@ func _on_connect_check_request_completed(result : int, _response_code, _headers,

func _on_FirebaseAuth_logout() -> void:
auth = {}

func _check_auth_error(code : int, message : String) -> void:
var err : String
match code:
400: err = "Please, enable Anonymous Sign-in method or Authenticate the Client before issuing a request (best option)"
printerr(err)
28 changes: 11 additions & 17 deletions addons/godot-firebase/firestore/firestore_collection.gd
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
## @meta-authors TODO
## @meta-version 2.2
## @meta-version 2.3
## A reference to a Firestore Collection.
## Documentation TODO.
tool
Expand Down Expand Up @@ -35,10 +35,6 @@ var _request_queues := {}
## @return FirestoreTask
## used to GET a document from the collection, specify @document_id
func get(document_id : String) -> FirestoreTask:
if not auth:
printerr("Unauthorized Firestore operation!")
return null

var task : FirestoreTask = FirestoreTask.new()
task.action = FirestoreTask.Task.TASK_GET
task.data = collection_name + "/" + document_id
Expand All @@ -54,10 +50,6 @@ func get(document_id : String) -> FirestoreTask:
## @return FirestoreTask
## used to SAVE/ADD a new document to the collection, specify @documentID and @fields
func add(document_id : String, fields : Dictionary = {}) -> FirestoreTask:
if not auth:
printerr("Unauthorized Firestore operation!")
return null

var task : FirestoreTask = FirestoreTask.new()
task.action = FirestoreTask.Task.TASK_POST
task.data = collection_name + "/" + document_id
Expand All @@ -73,10 +65,6 @@ func add(document_id : String, fields : Dictionary = {}) -> FirestoreTask:
## @return FirestoreTask
# used to UPDATE a document, specify @documentID and @fields
func update(document_id : String, fields : Dictionary = {}) -> FirestoreTask:
if not auth:
printerr("Unauthorized Firestore operation!")
return null

var task : FirestoreTask = FirestoreTask.new()
task.action = FirestoreTask.Task.TASK_PATCH
task.data = collection_name + "/" + document_id
Expand All @@ -94,10 +82,6 @@ func update(document_id : String, fields : Dictionary = {}) -> FirestoreTask:
## @return FirestoreTask
# used to DELETE a document, specify @document_id
func delete(document_id : String) -> FirestoreTask:
if not auth:
printerr("Unauthorized Firestore operation!")
return null

var task : FirestoreTask = FirestoreTask.new()
task.action = FirestoreTask.Task.TASK_DELETE
task.data = collection_name + "/" + document_id
Expand All @@ -115,6 +99,16 @@ func _get_request_url() -> String:

func _process_request(task : FirestoreTask, document_id : String, url : String, fields := "") -> void:
task.connect("task_error", self, "_on_error")

if not auth:
printerr("Unauthenticated request issued...")
Firebase.Auth.login_anonymous()
var result : Array = yield(Firebase.Auth, "auth_request")
if result[0] != 1:
Firebase.Firestore._check_auth_error(result[0], result[1])
return null
printerr("Client authenticated as Anonymous User.")

task._url = url
task._fields = fields
task._headers = PoolStringArray([_AUTHORIZATION_HEADER + auth.idtoken])
Expand Down
2 changes: 1 addition & 1 deletion override.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ appId=""
measurementId=""
clientId=""
clientSecret=""
domainUriPrefix=""
domainUriPrefix=""