簡體   English   中英

Firebase Admin SDK:設置/合並自定義用戶聲明

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM