2017-03-12 31 views
30

W poniższym przykładzie istnieje sposób na uzyskanie identyfikatora użytkownika, który napisał do/messages/{pushId}/original?Uzyskiwanie identyfikatora użytkownika z wyzwalacza bazy danych w Cloud Functions for Firebase?

exports.makeUppercase = functions.database.ref('/messages/{pushId}/original') 
.onWrite(event => { 
    // Grab the current value of what was written to the Realtime Database. 
    const original = event.data.val(); 
    console.log('Uppercasing', event.params.pushId, original); 
    const uppercase = original.toUpperCase(); 
    // You must return a Promise when performing asynchronous tasks inside a Functions such as 
    // writing to the Firebase Realtime Database. 
    // Setting an "uppercase" sibling in the Realtime Database returns a Promise. 
    return event.data.ref.parent.child('uppercase').set(uppercase); 
}); 

Odpowiedz

43

Tak, jest to technicznie możliwe, chociaż nie jest obecnie udokumentowane. Obiekt uid jest przechowywany z obiektem event.auth. Gdy baza danych Chmura Funkcja jest wyzwalany od sytuacji administratora (na przykład z danych Firebase Console widza lub z Admin SDK), wartość event.auth jest:

{ 
    "admin": true 
} 

gdy Database Chmura Funkcja jest wyzwalany ze związku Nieuwierzytelniona odniesienia, wartość event.data jest:

{ 
    "admin": false 
} 

I wreszcie, gdy Database Chmura Funkcja jest wyzwalany z authed, ale nie administrator, odniesienia, format event.auth jest:

{ 
    "admin": false, 
    "variable": { 
    "provider": "<PROVIDER>", 
    "provider_id": "<PROVIDER>", 
    "user_id": "<UID>", 
    "token": { 
     // Decoded auth token claims such as sub, aud, iat, exp, etc. 
    }, 
    "uid": "<UID>" 
    } 
} 

Biorąc pod uwagę powyższe informacje, najlepiej, aby uzyskać uid użytkownika, który wywołał zdarzenie jest wykonanie następujących czynności:

exports.someFunction = functions.database.ref('/some/path') 
    .onWrite(event => { 
    var isAdmin = event.auth.admin; 
    var uid = event.auth.variable ? event.auth.variable.uid : null; 

    // ... 
}); 

Wystarczy zauważyć, że w powyższym kodzie uid byłoby null nawet jeśli isAdmin to true. Twój dokładny kod zależy od Twojego przypadku użycia.

OSTRZEŻENIE: Jest to obecnie nieudokumentowane zachowanie, więc podam moje zwykłe zastrzeżenie, że "nieudokumentowane funkcje mogą zostać zmienione w dowolnym momencie w przyszłości bez powiadomienia, a nawet w wydaniach innych niż główne".

+0

Wielkie dzięki. To działało dla mnie. – Sunny

+5

Jakiś powód, dla którego nie ma publicznego interfejsu API? Wydaje się, że jest to rozsądny przypadek użycia (badamy FB jako backend i było to bardzo ważne pytanie). – alalonde

+4

Wszelkie przesłanki, że to się zmieni lub pozostanie? Jest to idealne rozwiązanie dla mojego przypadku użycia, ale nie chcę go używać, jeśli nadal można zmienić. – skwny