NodeJS 在从服务器函数更新用户的自定义声明后,我如何'reload()'用户的令牌?

ars1skjm  于 2023-03-17  发布在  Node.js
关注(0)|答案(2)|浏览(130)

bounty将在5天后过期。回答此问题可获得+100声望奖励。Ben希望引起更多人关注此问题。

我有一个更新用户自定义声明的服务器函数。

exports.onEmployeeUpdated = functions.firestore
  // When a employee document is updated, if <condition> update isApproved custom claim

  .document('employees/{employeeId}')
  .onUpdate(async (change, context) => {

      // Update the user's existing claims
      const uid = context.params.employeeId
      return getAuth()
        .getUser(uid)
        .then((userRecord) => {
          let claims = userRecord.customClaims
          claims['isApproved'] = false

          // Assign the new claims
          return getAuth().setCustomUserClaims(uid, claims).then(() => {
            // reload() here
          })
        })
        .catch((error) => {
          return `Custom claim not updated because no user with id ${uid} exists`
        })
    }
  })

我的理解是reload()可以是used to refresh the token from the server,但是我不清楚如何实际调用reload()

zzwlnbp8

zzwlnbp81#

据我所知,您不能强制客户端刷新服务器端的令牌,您链接的reload方法实际上是Node.js client SDK的一部分,您链接的问题描述了如何通过从服务器端取数据来重载客户端的用户。
根据文档,您可以通过调用getIdToken(true)“刷新客户端 *”上的ID标记 *。
示例:(使用JS v9 SDK):

import { getIdTokenResult } from "firebase/auth";

const { claims } = await getIdTokenResult(auth.currentUser, true); // true = force a refresh
console.log(claims.isApproved); // should be false
webghufk

webghufk2#

总而言之,您不能强制客户端刷新服务器端的令牌。相反,您可以通过调用getIdToken(true)来刷新客户端的ID令牌。这将强制客户端从服务器获取新令牌,其中将包括更新的自定义声明。

exports.onEmployeeUpdated = functions.firestore
  // When a employee document is updated, if <condition> update isApproved custom claim
  .document('employees/{employeeId}')
  .onUpdate(async (change, context) => {

  // Update the user's existing claims
  const uid = context.params.employeeId
  return admin.auth().getUser(uid)
    .then((userRecord) => {
      let claims = userRecord.customClaims
      claims['isApproved'] = false

      // Assign the new claims
      return admin.auth().setCustomUserClaims(uid, claims).then(() => {
        // Refresh the user's ID token with updated custom claims
        return userRecord.getIdToken(true)
      })
    })
    .then((idToken) => {
      // Return the refreshed ID token to the client
      return {
        idToken: idToken
      }
    })
    .catch((error) => {
      return `Custom claim not updated because no user with id ${uid} exists`
    })
}
  })

相关问题