【问题标题】:Cloud Functions - User custom claims returns undefinedCloud Functions - 用户自定义声明返回未定义
【发布时间】:2019-07-04 13:13:35
【问题描述】:

我使用带有附加声明的自定义令牌创建了一个新用户。

我可以访问 Firestore 安全规则中的声明,但在 云函数中它返回未定义。

创建用户代码:

admin.auth()
.createCustomToken(uid, claims)
.then(token => {
    console.log(token);
 });

创建用户的代码:

admin.auth().getUser(uid)
.then((userRecord) => { 

 console.log(userRecord.customClaims);

});

userRecord.customClaims 返回未定义

【问题讨论】:

  • 这段代码应该可以工作。您应该共享整个代码,尤其是创建新用户和设置声明的代码部分。
  • @RenaudTarnec 感谢您的回复。我更新了代码。请检查一下。

标签: firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

您应该使用setCustomUserClaims()。不是createCustomToken()

admin.auth()
.setCustomUserClaims(uid, claims)
.then(token => {
    console.log(token);
 });

setCustomUserClaims() 总是被覆盖,所以我建议获取当前的 customClaims 并合并。

视情况而定,我推荐使用async/await。

像这样。

async function setClaims(uid, claims) {
    try {
        const userRecord = await admin.auth().getUser(uid);
        return await admin.auth().setCustomUserClaims(uid, {
            ...userRecord.customClaims,
            ...claims
        });
    } catch (e) {
        return Promise.reject(e);
    }
}

更新

setCustomUserClaims()

对由提供的 uid 标识的现有用户设置额外的开发者声明

createCustomToken()

创建一个新的 Firebase 自定义令牌 (JWT),该令牌可以发送回客户端设备,用于使用客户端 SDK 的 signInWithCustomToken() 方法登录。

您还可以选择指定要包含在自定义令牌中的其他声明。例如,下面的自定义令牌中添加了一个 premiumAccount 字段,该字段将在您的安全规则中的 auth / request.auth 对象中可用:

它仅在您的安全规则中的 auth / request.auth 对象中可用。所以不要设置用户customClaims。

【讨论】:

  • 感谢您的回答。 setCustomUserClaims 用于覆盖声明。但我已经在用户创建(createCustomToken)期间设置了声明。我的问题是我可以访问 Firestore 安全规则中的声明,但它在云函数中返回未定义。我更新了问题,请检查一下。
  • 好的。您的代码似乎是正确的。你能调试uid是一样的吗? (设置/获取)。我可以正常使用userRecord.customClaims 获得索赔。
  • 我的 uid 是正确的。我记录了所有显示的userRecord。但是自定义声明是未定义的。你能用我用的代码检查一下吗?我认为这是一个错误。
  • 我认为它只有在我使用setCustomUserClaims 设置声明时才有效。但是为什么我们需要覆盖在用户创建期间已经设置的声明。 createCustomToken(uid, claims)
  • 更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多