2017-03-12 109 views
30

在下面的例子中,有沒有辦法獲得寫給/ messages/{pushId}/original的用戶的uid?從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); 
}); 

回答

43

是的,這在技術上是可行的,雖然目前沒有記錄。 uidevent.auth對象一起存儲。當一個數據庫雲功能是從一個管理狀況觸發(例如,來自火力地堡控制檯數據查看器,或從管理員SDK),的event.auth值是:

{ 
    "admin": true 
} 

當數據庫雲功能是從一個觸發未經驗證的參考,event.data值是:

{ 
    "admin": false 
} 

最後,當數據庫雲功能是從authed觸發,但不是管理員,參考,event.auth格式爲:

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

鑑於上述信息,最好的辦法讓誰觸發事件的用戶的uid是做到以下幾點:

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

    // ... 
}); 

只是注意到,在上面的代碼,uidnull即使isAdmintrue。您的確切代碼取決於您的用例。

警告:這是目前無證行爲,所以我就給我平時的告誡「無證功能可能在將來,恕不另行通知,甚至在非主要版本的任何一點改變。」

+0

非常感謝。這對我有效。 – Sunny

+5

爲什麼沒有這個公共API的任何原因?看起來像一個合理的用例(我們正在探索FB作爲後端,這是一個非常重要的問題)。 – alalonde

+4

任何跡象表明這將改變或停留?這對我的用例很理想,但如果仍然可以更改,我不想使用它。 – skwny

相關問題