0

Ich verwende nur den Echtzeitdatenbank-Teil von Firebase.Kann Python SDK JS-Client für Firebase-Ereignisse registrieren?

Ich habe einen Python Firebase Admin auf dem Server, ein Javascript Firebase auf dem Webclient. Kein Android oder iOS. Mein Web-Javascript-Client erhält ein Token vom Python-Server für seine Authentifizierung.

Nur der Python-Server schreibt in Firebase, der Javascript-Client tut dies nie. Der Client registriert jedoch einen "child_added" Listener mit Firebase, um Datenbankänderungen in Daten zu empfangen.

Alles funktioniert außer für diesen Ereignis-Listener.

Die Firebase docs sagen:

Das Python-Admin SDK unterstützt derzeit nur Blockierung liest. Es kann nicht verwendet werden, um Ereignislistener hinzuzufügen, die Echtzeit-Updates Benachrichtigungen erhalten.

Aber wie ich es verstehe, gilt das für meinen Server, nicht für den Client. Oder wird das Abrufen eines benutzerdefinierten Tokens von einem Python-Admin den Javascript-Client für diese Ereignisse disqualifiziert?

Vielleicht ist es ein Problem, dass der Server sich mit den Anmeldeinformationen des Dienstkontos initialisiert, während der Client dies mit einem API-Schlüssel tut? Wenn ja, warum gibt Firebase keinen Fehler aus?

Hier ist der relevante Python-Code (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 

Alles, was in Ordnung so weit wie der Server arbeitet in der Lage zu schreiben, um Feuerbasis und eine benutzerdefinierte Token zu erzeugen.

Das JavaScript-Web-Client erhält einen Token aus dem Python-Server (nicht dargestellt), und registriert den Ereignis-Listener mit:

(
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()); }); 
     } 
    } 
} 
)(); 

Antwort

Verwandte Themen