Firebase Realtime Databaseの adminRef と ref の違いとは。
最近CloundFunctionを書くことが増えてきて、function内でDBに書き込んだりすることが多いのですが、
そのときに、adminRef というのをよく見かけます。例えば
export const someFunction = functions.database.ref('v1/users/{userID}').onCreate(async event => {
try {
let thirdPartyID = await ...
await event.data.adminRef.update({ thirdPartyID })
} catch (error) {
console.log(error)
}
})
こんな感じで、/v1/user/ 以下に新しいuserレコードが追加された時に、何か処理をして、そのrefに対して値を書き込む時に、 event.data.adminRef って書いたりします。
実は、 adminRef ではなくて ref というのも存在します。
event.data.adminRef.update({ thirdPartyID })
event.data.ref.update({ thirdPartyID })
どちらも違いは無さそうなのですが、何が違うのかしっかり調べてみました。
違い
https://firebase.google.com/docs/reference/functions/functions.database.DeltaSnapshot
ここを見る限り、
adminRefはpermissionに関係なくparent等にread/writeすることができるrefは敷かれたpermissionと同じ範囲しか権限がないので場合によってはアクセスができない
ようです。例えば最初の例だと、userモデルがusersを仮に参照して何か書き込みをしたりしたい場合に、databaseのルールで権限が与えられていなかったりするとアクセスができなかったりするので、
そういうケースでは adminRefを使って adminRef.parent みたいに遡って参照していくと良さそうです。
しっかりpermissionまで考慮して運用するなら ref の方が正しいように見えますが、 通常は adminRef でも問題無さそうな気がしてきました。