我只使用Firebase的实时数据库部分 .
我在服务器上有一个Python Firebase管理员,在Web客户端上有一个Javascript Firebase . 没有Android或iOS . 我的Web Javascript客户端从Python服务器接收令牌以进行身份验证 .
只有Python服务器写入Firebase,Javascript客户端永远不会 . 但客户端使用Firebase注册“child_added”侦听器以接收数据中的数据库更改 .
Everything works except for this event listener.
Python Admin SDK目前仅支持阻止读取 . 它不能用于添加接收实时更新通知的事件侦听器 .
但据我了解,这适用于我的服务器,而不是客户端 . 或 does getting a custom token from a Python Admin disqualify the Javascript client for these events?
也许这是一个问题,服务器使用服务帐户凭据初始化自己,而客户端使用api密钥这样做?如果是这样,为什么Firebase不会发出错误?
这是相关的Python代码(views.py):
import firebase_admin
from firebase_admin import credentials, auth, db
def getFirebaseInstance():
try:
# using fresh download of key from service account for this app
cred = credentials.Certificate('myapp/static/myap/firebase/firebase-adminsdk-4mcup-144fd3c404.json')
firebase = firebase_admin.initialize_app(cred,{'databaseURL': 'https://my-db-url'})
except:
raise
@login_required()
def firebaseClientToken(request):
try:
global __firebase
if __firebase is None:
__firebase = getFirebaseInstance()
token = firebase_admin.auth.create_custom_token('1')
return HttpResponse(token)
except Exception as err:
return HttpResponse("System error:" + str(err), status=406)
def sendToFirebase(request, data):
try:
global __firebase
if not __firebase:
__firebase = getFirebaseInstance()
db = firebase_admin.db
ref = db.reference("messages/")
ref.push(json.dumps(data))
except Exception:
raise
只要服务器能够写入firebase并生成自定义令牌,所有这一切都可以正常工作 .
javascript Web客户端从Python服务器(未显示)接收令牌,并将事件监听器注册为:
(
function authClient2Firebase() {
var waiting;
$.ajax({
url: "firebaseClientToken/",
method: "POST",
success: function(response) { step2(response); },
error: function(xhr) { alert(xhr.responseText); }
});
function step2(customToken) {
try {
firebase.auth().signInWithCustomToken(customToken).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
alert(errorMessage + ' code:' + errorCode);
});
var db = firebase.database();
var fbRef = db.ref("myapp");
fbRef.startAt(loadTransaction.time).on ( "child_added",
function(snapshot) { alert(snapshot.val()); });
}
}
}
)();
1 回答
它完全与令牌或身份验证无关,但Firebase Python中的push(data)命令与Javascript SDK与其文档之间存在差异 .
请参阅接受的答案:Why does Firebase event return empty object on second and subsequent events?