[英]Firebase Admin SDK: Set / Merge Custom User Claims
Firebase 是否有任何技巧,例如{ merge: true }
來設置額外/更多自定義聲明而不刪除/覆蓋舊變量?
重現步驟:
admin.auth().setCustomUserClaims(uid, { a: 'value' }) // Run this first
admin.auth().setCustomUserClaims(uid, { b: 'value' }) // Then run this after
結果:
{ b: 'value'}
預期結果:
{ a: 'value', b: 'value' }
還是我做錯了什么?
setCustomUserClaims
的 Firebase 文檔指出:
- customUserClaims :對象
開發商聲稱設置。 如果傳遞 null,則刪除現有的自定義聲明。 傳遞大於 1000 字節的自定義聲明負載將引發錯誤。 自定義聲明被添加到用戶的 ID 令牌中,該令牌在每個經過身份驗證的請求上傳輸。 對於配置文件非訪問相關的用戶屬性,使用數據庫或其他單獨的存儲系統。
從這個描述中並不完全清楚,但聲明“如果傳遞 null,現有的自定義聲明將被刪除”提供了一個提示,即每次調用setCustomUserClaims
完全覆蓋自定義聲明。
因此,自定義聲明需要設置如下:
claims = {
a: 'value',
b: 'value'
}
admin.auth().setCustomUserClaims(uid, claims)
addCustomUserClaims
可以創建一個輔助函數來合並新的聲明。
async function addCustomUserClaims(uid, claims) {
const user = await admin.auth().getUser(uid)
let updated_claims = user.customClaims || {}
for (let property in claims) {
if (Object.prototype.hasOwnProperty.call(claims, property)) {
updated_claims[property] = claims[property]
}
}
await admin.auth().setCustomUserClaims(uid, updated_claims)
}
Christopher Peisert 的回答是正確的,但它可以做得更干凈,因為
admin.auth().getUser(uid).then(({customClaims: oldClaims}) =>
admin.auth().setCustomUserClaims(uid, { ...oldClaims, b: 'value' }))
如果你想把這個邏輯抽象成一個函數,可以這樣做
function addCustomUserClaims(uid, claims) {
return admin.auth().getUser(uid).then(({customClaims}) =>
admin.auth().setCustomUserClaims(uid, { ...customClaims, ...claims }))
}
或等效地*為
const addCustomUserClaims = (uid, claims) =>
admin.auth().getUser(uid).then(({customClaims}) =>
admin.auth().setCustomUserClaims(uid, { ...customClaims, ...claims }))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.