首页 文章

Python SDK可以为Firebase事件注册JS客户端吗?

提问于
浏览
0

我只使用Firebase的实时数据库部分 .

我在服务器上有一个Python Firebase管理员,在Web客户端上有一个Javascript Firebase . 没有Android或iOS . 我的Web Javascript客户端从Python服务器接收令牌以进行身份验证 .

只有Python服务器写入Firebase,Javascript客户端永远不会 . 但客户端使用Firebase注册“child_added”侦听器以接收数据中的数据库更改 .

Everything works except for this event listener.

Firebase docs说:

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 回答

相关问题