Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting the user id from a database trigger in Cloud Functions for Firebase?

In the example below, is there a way to get the uid of the user who wrote to /messages/{pushId}/original?

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); }); 
like image 468
Bilal Soomro Avatar asked Mar 12 '17 16:03

Bilal Soomro


People also ask

Which function is used for users to listen monitor for changes in the firebase?

Set the event handler Functions let you handle Realtime Database events at two levels of specificity; you can listen for specifically for only creation, update, or deletion events, or you can listen for any change of any kind to a path.


1 Answers

UPDATED ANSWER (v1.0.0+):

As noted in @Bery's answer above, version 1.0.0 of the Firebase Functions SDK introduced a new context.auth object which contains the authentication state such as uid. See "New properties for user auth information" for more details.

ORIGINAL ANSWER (pre v1.0.0):

Yes, this is technically possible, although it is not currently documented. The uid is stored with the event.auth object. When a Database Cloud Function is triggered from an admin situation (for example, from the Firebase Console data viewer or from an Admin SDK), the value of event.auth is:

{   "admin": true } 

When a Database Cloud Function is triggered from an unauthenticated reference, the value of event.data is:

{   "admin": false } 

And finally, when a Database Cloud Function is triggered from an authed, but not admin, reference, the format of event.auth is:

{   "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>"   } } 

Given the information above, your best bet to get the uid of the user who triggered the event is to do the following:

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

Just note that in the code above, uid would be null even if isAdmin is true. Your exact code depends on your use case.

WARNING: This is currently undocumented behavior, so I'll give my usual caveat of "undocumented features may be changed at any point in the future without notice and even in non-major releases."

like image 56
jwngr Avatar answered Sep 30 '22 20:09

jwngr